📄 chatserver.java
字号:
import java.net.*;
import java.io.*;
import java.util.*;
/***************************************************************************
*
* Created by: 耿关辉
* Started: August, 2003
*
* 该程序作为 applet 使用.
*
* 程序编译后生成三个class文件: chatserver, broadcaster and listener.
*
***************************************************************************/
// - chatserver, parent class.
public class Chatserver {
//method: swrite -- chatserver class 的基本连接
public static void swrite(Socket sock, String str) throws Exception {
OutputStream outStream = sock.getOutputStream();
outStream.write(str.getBytes());
outStream.flush();
}
//method: main
public static void main(String args[]) throws Exception {
//
// Communications
//
Listener listenHandle = null;
Broadcaster broadHandle = null;
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
ServerSocket server = new ServerSocket(Integer.parseInt(args[0]));
InputStream inStream;
BufferedReader inReader;
Socket sock;
//
// tmpVars and output strings
//
int counter = -1;
long tmpKey;
String name, systemOut;
System.out.println("Chat Server Running");
while (true) {
//
// 获得,打开一个新连接
//
sock = server.accept();
inReader = new BufferedReader(
new InputStreamReader(
sock.getInputStream()));
//
// 获得用户名称
//
swrite(sock, "Name? ");
name = inReader.readLine();
tmpKey = (new Date()).getTime();
if (counter == -1) {
broadHandle =
new Broadcaster(sock, in, tmpKey, name);
listenHandle =
new Listener(sock, out, tmpKey, name, broadHandle);
Thread t1 = new Thread(listenHandle);
Thread t2 = new Thread(broadHandle);
t1.start();
t2.start();
} else {
listenHandle.addSock(sock, tmpKey, name);
broadHandle.addSock(sock, tmpKey, name);
}
//
// 获得当前连接的数目
//
counter = listenHandle.numSocks();
systemOut = "Added User : " + name + " (" + counter + ")";
System.out.println(systemOut);
}
}
}
//- Broadcaster 广播程序. 由chatserver生成.
class Broadcaster implements Runnable {
Hashtable sockHash = new Hashtable();
InputStream in;
private Socket sock;
private PrintWriter ostr;
//method: constructor -- call addSock, 配置输入.
public Broadcaster(Socket sock, InputStream in, long i, String name)
throws IOException {
this.in = in;
addSock(sock, i, name);
}
//method: bCast -- 输出 (到打印机).
private void bCast(String s) throws IOException {
PrintWriter os;
for (Enumeration e = sockHash.elements() ; e.hasMoreElements() ;) {
os = (PrintWriter)e.nextElement();
os.println(s);
os.flush();
}
}
//method: addSock -- 添加新连接到 bCast user.
public void addSock(Socket sock, long i, String name)
throws IOException {
ostr = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
sockHash.put(Long.toString(i), ostr);
try {
bCast(name + " has joined.");
}
catch (Exception e) {
e.printStackTrace();
}
}
//method: delSock -- 在hashtable中删除一个连接.
public void delSock(Object hKey) throws IOException {
sockHash.remove(hKey);
}
//method: run -- 循环
public void run() {
BufferedReader istr = new BufferedReader(new InputStreamReader(in));
try {
while (true) {
bCast(istr.readLine());
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
// Listener: 输入线程
class Listener implements Runnable
{
Hashtable sockHash = new Hashtable();
Hashtable nameHash = new Hashtable();
OutputStream out;
Broadcaster broadHandle;
private Socket sock;
private BufferedReader istr;
// method: constructor -- call addSock, 建立到Broadcaster的连接
public Listener(Socket sock, OutputStream out,
long i, String name, Broadcaster broadHandle) throws IOException
{
this.broadHandle = broadHandle;
this.out = out;
addSock(sock, i, name);
}
// method: addSock -- 建立一个新连接到hashtable.
public void addSock(Socket sock, long i, String name) throws IOException
{
istr = new BufferedReader(new InputStreamReader(sock.getInputStream()));
sockHash.put(Long.toString(i), istr);
nameHash.put(Long.toString(i), name);
}
// method: numSocks -- 返回已知连接用户数目
public int numSocks()
{
return sockHash.size();
}
// method: delSock -- 在hashtable中断开一个连接,并输出断开信息
public void delSock(Object hKey) throws IOException
{
String systemOut;
String tmpName = (String)nameHash.get(hKey);
String tmpStr = tmpName + " has left.\n";
// 终止到broadcaster的连接
broadHandle.delSock(hKey);
// 关闭 socket
BufferedReader tmpBfr = (BufferedReader)sockHash.get(hKey);
tmpBfr.close();
// 清除hashtable中的所有连接
sockHash.remove(hKey);
nameHash.remove(hKey);
out.write(tmpStr.getBytes());
systemOut = "Removed User : " + tmpName + " (" + nameHash.size() + ")";
System.out.println(systemOut);
}
// method: run -- 主线程操作,循环
public void run()
{
String tmpStr, tmpName, tmpInput;
String exitStr = new String("exit");
Object tmpKey;
BufferedReader tmpBfr;
try
{
while (true) // Loop thru hash table looking for input that is ready to be posted.
{
for (Enumeration e = sockHash.keys() ; e.hasMoreElements() ;)
{
tmpKey = e.nextElement();
tmpBfr = (BufferedReader)sockHash.get(tmpKey);
if (tmpBfr.ready())
{
tmpInput = tmpBfr.readLine();
if (tmpInput.compareToIgnoreCase(exitStr) == 0) { delSock(tmpKey);
}
else if (tmpInput != "")
{
tmpName = (String)nameHash.get(tmpKey);
tmpStr = tmpName + " : " + tmpInput + "\n";
out.write(tmpStr.getBytes());
}
}
}
}
}
catch (Exception e) { e.printStackTrace();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -