packagechat;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.concurrent.CopyOnWriteArrayList;public classServerChat {private static CopyOnWriteArrayList all = new CopyOnWriteArrayList<>();public static void main(String[] args) throwsIOException {
System.out.println("##################Server##############");
ServerSocket server= new ServerSocket(8888);while (true){
Socket socket=server.accept();
System.out.println("进入");
ServerC serverC= newServerC(socket);
all.add(serverC);//使用多线程分离各个客户端
newThread(serverC).start();
}
}static class ServerC implementsRunnable{privateSocket socket;privateDataOutputStream dos;privateDataInputStream dis;publicServerC(Socket socket) {this.socket =socket;try{
dis= newDataInputStream(socket.getInputStream());
dos= newDataOutputStream(socket.getOutputStream());
}catch(IOException e) {
e.printStackTrace();
release();
}
}/*** 获取客户端data
*@return
*/
publicString remsg(){//接受消息
String data = null;try{
data=dis.readUTF();
}catch(IOException e) {
e.printStackTrace();
}returndata;
}//消息转发给所有人函数
public voidtransaction(String data){try{
dos.writeUTF(data);
dos.flush();
}catch(Exception e){
release();
}
}//群发给客户端
public voidallsend(String data) {for(ServerC serverC : all) {if (this ==serverC) {continue;
}else{
serverC.transaction(data);
}
}
}//释放资源函数
public voidrelease(){try{
dos.close();
dis.close();
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
@Overridepublic voidrun() {
String data=remsg();
allsend(data);
}
}
}