【发布时间】:2013-03-21 07:33:18
【问题描述】:
在我的应用程序中使用 ServerSocket 时遇到问题。
我正在我的应用程序的构造函数中创建ServerSocket。 socket的构造函数调用accept()方法等待客户端连接。
问题是accept() 方法正在冻结我的整个应用程序,直到客户端连接。所以我想问一下,除了在单独的线程中创建整个 ServerSocket 之外,是否还有其他方法可以在我的主应用程序旁边调用 ServerSocket 及其 accept() 方法的构造函数?
编辑:
感谢 Olivier 的建议,将 .accept 放入可运行文件并创建线程池来处理客户端连接。
这就是我现在的代码:
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.");
}
}
};
一切正常!谢谢!
【问题讨论】:
-
尝试在单独的线程中移动套接字相关代码?遇到什么具体问题?
-
看看java.nio.channels.AsynchronousServerSocketChannel,看看它是否符合你的要求。
-
或者更好,看看这个问题:stackoverflow.com/questions/8940747/…
-
我的问题是它不足以将 ServerSocket 实现为线程,因为 .accept 方法已经在其构造函数中而不是在其运行方法中调用。因此,一旦我尝试创建线程,它就已经冻结了我的应用程序。
标签: java multithreading serversocket