//监听主线程
public class Server extendsThread {//服务器Socket
private ServerSocket serverSocket = null;private ArrayList clientList = null;//显示区
private JTextArea jTextArea = null;//构造函数
public Server(intport, JTextArea area) {
jTextArea=area;try{//开始绑定端口
serverSocket = newServerSocket(port);//初始化客户端连接的列表
clientList = new ArrayList();
}catch(IOException e) {
System.err.println("服务器端口初始化失败!\n");
}
jTextArea.setText("服务器成功启动,等待客户连接!\n");
start();//启动线程
}public voidsendServerMsg(String msg) {
jTextArea.append(msg+ "\n");for (int i = clientList.size() - 1; i >= 0; i--) {
clientList.get(i).getWriter().println("服务器:" +msg);
clientList.get(i).getWriter().flush();
}
}//线程程序
public voidrun() {while (true) {try{//用阻塞的方式,等待用户连接请求
Socket socket =serverSocket.accept();//启动一条为客户端服务的线程
ServerThread svthread = newServerThread(socket);
svthread.start();//将该客户加入列表中
clientList.add(svthread);
}catch(IOException e) {
e.printStackTrace();
}
}
}//服务线程(内部类),用于处理客户端的服务线程
class ServerThread extendsThread {//当前正在连接的Socket
Socket socket = null;//当前连接的Socket的输入和输出流(数据出入口)
private PrintWriter writer = null;private BufferedReader reader = null;//构造函数
publicServerThread(Socket s) {
socket=s;try{//获取输入输出流
reader = new BufferedReader(newInputStreamReader(
s.getInputStream()));
writer= newPrintWriter(s.getOutputStream());//在此可以写接收用户端的信息,解析出来(IP地址)
}catch(Exception e) {
e.printStackTrace();
}
}//获得输入流,供外界调用
publicBufferedReader getReader() {returnreader;
}//获得输出流,供外界调用
publicPrintWriter getWriter() {returnwriter;
}//获得socket
publicSocket getSocket() {returnsocket;
}//线程服务程序
public voidrun() {//创建一个变量,用于接收客户端发来的信息
String message = null;while (true) {try{//读取输入流
message =reader.readLine();//如果是下线命令
if (message.equals("Bye")) {//在客户端列表上删除该用户
ServerThread temp = null;for (int i = clientList.size() - 1; i >= 0; i--) {
temp=clientList.get(i);if(temp.getSocket().equals(socket)) {
clientList.remove(i);
}
temp.stop();
}//断开连接释放资源
reader.close();
writer.close();
socket.close();return;
}else{//在文本区显示该消息
jTextArea.append(message + "\n");//将该消息广播给其他用户
broadcastMsg(message);
}
}catch(Exception e) {//TODO: handle exception
}
}
}//广播消息
public voidbroadcastMsg(String msg) {for (int i = clientList.size() - 1; i >= 0; i--) {
clientList.get(i).getWriter().println(msg);
clientList.get(i).getWriter().flush();
}
}
}
}