3

我目前正在学习如何在 java 中编写一个 tcp 服务器。我正在为新的每个客户端连接(多线程服务器)创建一个新线程。

客户端连接到服务器后,我想将数据从客户端发送到服务器。在服务器端,服务器处于从套接字输入流读取数据的 while 循环中。我现在想问:我应该为每个收到的数据包创建一个新线程吗?

例如,客户端发送字符串“Hello”。服务器是否应该在新线程中处理此数据包以便它可以继续读取,因为我认为如果我不创建新线程,服务器不会继续读取,并且如果客户端在“Hello”数据包之后发送另一个数据包例如“Bye”,服务器可能不会读取它,因为它可能仍在忙于处理“Hello”数据包。

需要明确的是,我不是在谈论 serversockets 接受方法,而是在谈论来自套接字输入流的数据。

请赐教。

4

3 回答 3

3

如果您的数据包处理任务不是很繁重(可能不是),您不应该这样做。线程将处理一条消息并返回接收新消息。不会丢失任何数据 - 如果没有人从输入流中读取数据,则数据传输将保持(在所有缓冲区填满之后)。每个客户端只保留一个线程,在大多数情况下就足够了。

于 2012-08-18T10:09:26.403 回答
2

是的,您必须委托给另一个线程才能拥有响应式服务器。不,不要为每个请求创建一个线程(除非客户端负载很小),而是使用线程池。示例骨架代码(当然你必须以某种方式跳出循环):

private static final ExecutorService threadPool = Executors.newCachedThreadPool();  

while(true){  

  final Socket clientConnection = serverSocket.accept();  
  threadPool.execute(new Runnable(){  
            public void run(){  
                  processConnection(clientConnection);  
            });               

}  

我应该为每个收到的数据包创建一个新线程吗?

不。每个线程将处理自己的连接(接收客户端数据包),因此连接客户端将得到更快的服务,因为主侦听器将继续接受连接

于 2012-08-18T10:16:56.110 回答
0

对于小型应用程序,每个客户端连接一个线程就可以了。但是,每个客户端请求/数据包一个线程根本不是一个好方法。只要确保您的服务器可以及时与客户端通信。

请注意,您创建的线程数不是无限的,它取决于您使用的操作系统。实际应用程序使用线程池来处理这种情况。

于 2012-08-18T10:17:26.483 回答