服务端
创建一个server包,并在该包下创建ChatServer.java用于开启服务器,与用户进行连接、以及将转发用户的信息到其他用户中
import java.io.Closeable;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ChatServer {
private static final String LOCALHOST = "localhost";
private static final int DEFAULT_PORT = 8888;
private static final String QUIT = "quit";
private static final int BUFFER = 1024;
private static final int THREADPOOL_SIZE = 8;
private AsynchronousChannelGroup channelGroup;
private AsynchronousServerSocketChannel serverSocketChannel;
private Charset charset = Charset.forName("utf-8");
private List<ClientHandler> connectedClient;
private int port;
public ChatServer(int port) {
this.port = port;
this.connectedClient = new ArrayList<>();
}
public ChatServer() {
this(DEFAULT_PORT);
}
/**
* 当输入"quit"时表示客户退出
* @param msg
* @return
*/
private boolean readyToQuit(String msg){
return QUIT.equals(msg);
}
/**
* 关闭相对应的流并释放与之相关联的任何系统资源,如果流已关闭,则调用此方法将不起任何作用
* @param closeable
*/
private void close(Closeable closeable){
if (closeable!=null){
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 添加一个新的客户端进客户端列表(list集合)
* @param handler
*/
private synchronized void addClient(ClientHandler handler) {
connectedClient.add(handler);
System.out.println(getClientName(handler.clientChannel)+"已经连接到服务器");
}
/**
* 将该客户(下线)从列表中删除
* @param clientHandler
*/
private synchronized void removeClient(ClientHandler clientHandler) {
connectedClient.remove(clientHandler);
System.out.println(getClientName(clientHandler.clientChannel)+