socket server是基于TCP协议的C/S通信模式下,服务器端的实现。一个socket server最主要的工作是处理网络IO,同事,高效处理网络IO也是一个socket server最重要的性能指标。
本文会用java NIO框架实现一个同步非阻塞的socket server。
最基础的结构
首先从最基础的考虑。一个socket server最简单最经典的实现必然是多线程阻塞的版本:
主线程监听socket端口(阻塞),每当有新客户连接,为这个用户单独创建一个线程,并在新线程里处理业务逻辑:
class Server implements Runnable {
public void run() {
try {
ServerSocket ss = new ServerSocket(PORT);
while (!Thread.interrupted())
new Thread(new Handler(ss.accept())).start();
// or, single-threaded, or a thread pool
} catch (IOException ex) { }
}
}
class Handler implements Runnable {
final Socket socket;
Handler(Socket s) { socket = s; }
public void run() {
try {
byte[] input = new byte[MAX_INPUT];
socket.getInputStream().read(input);
byte[] output = process(input);
socket.getOutputStream().write(output);
} catch (IOException ex) { }
}
private byte[] process(byte[] cmd) { }
}
这种I/O模型的主要缺点是:线程不是免费的。操作系统分配给每个进程的最大线程数是有限的,在高并发的情况下,服务器会因为不能创建新线程而不能响应请求。
这时,演变成线程池版本的多线程服务器:
public class ExecutorServiceServer