java在单独的线程中创建ServerSocket?
我在应用程序中使用ServerSocket
时遇到问题
我正在应用程序的构造函数中创建ServerSocket
。socket的构造函数调用accept()
方法等待客户端连接
问题是accept()
方法正在冻结我的整个应用程序,直到客户端连接。所以我想问一下,除了在一个单独的线程中创建整个ServerSocket
之外,是否还有其他方法,在我的主应用程序旁边调用ServerSocket
及其accept()
方法的构造函数
编辑:
多亏了奥利弗的建议,我才把这本书出版了。接受到一个可运行的线程池中,并创建一个线程池来处理clientconnections
这就是我现在的代码:
public void start(){
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
serverSocket = new ServerSocket(port);
while (true) {
Socket clientSocket = serverSocket.accept();
objectout = new ObjectOutputStream(clientSocket.getOutputStream());
clientProcessingPool.submit(new ClientTask(clientSocket,objectout));
}
} catch (IOException e) {
System.err.println("Accept failed.");
}
}
};
一切正常!谢谢
# 1 楼答案
通常,我使用N+1个线程来实现这一点:一个线程用于ServerSocket,以避免阻塞等待客户端连接的整个应用程序;N个线程来处理客户端的请求,N是线程池的大小(我建议使用线程池,而不是为每个客户端创建一个新线程)
下面是一个示例(刚刚编写了代码,您可能希望有更好的异常管理等等,但这是一个最小的工作示例)