我目前正在学习如何在java中编写tcp服务器。我正在为新的每个客户端连接(多线程服务器)创建一个新线程。
客户端连接到服务器后,我想将数据从客户端发送到服务器。在服务器端,服务器处于while循环中,从套接字输入流中读取数据。我现在想问:我应该为每个收到的数据包创建一个新线程吗?
例如,客户端发送字符串“Hello”。服务器是否应该在新线程中处理此数据包以便继续读取,因为我认为如果我不创建新线程,则服务器不会再次读取,如果客户端在“Hello”数据包之后发送另一个数据包例如“再见”,服务器可能无法读取它,因为它仍然可能忙于处理“Hello”数据包。
要明确我不是在谈论serversockets接受方法,我在讨论来自套接字输入流的数据。
请赐教我。
答案 0 :(得分:3)
如果你的数据包句柄任务不是很重(可能不是),你就不应该这样做。线程将处理消息并返回接收新消息。没有数据会丢失 - 如果没有人从输入流中读取,数据传输就会保持(在所有缓冲区填满之后)。 只需为每个客户端保留一个线程,在大多数情况下就足够了。
答案 1 :(得分:2)
是的,您必须委托另一个线程才能拥有响应式服务器。不,不要为每个请求创建一个线程(除非客户端加载很简单),而是使用thread pool。 示例框架代码(当然,您必须以某种方式突破循环):
private static final ExecutorService threadPool = Executors.newCachedThreadPool();
while(true){
final Socket clientConnection = serverSocket.accept();
threadPool.execute(new Runnable(){
public void run(){
processConnection(clientConnection);
});
}
我应该为每个收到的数据包创建一个新线程吗?
没有。每个线程将处理自己的连接(接收客户端数据包),因此连接客户端将更快地得到服务,因为主要监听器将继续接受连接
答案 2 :(得分:0)
每个客户端连接一个线程适用于小型应用程序。但是,每个客户端请求/数据包一个线程根本不是一个好方法。只需确保您的服务器能够及时与客户进行通信。
请注意,您创建的线程数量无限制,这取决于您使用的操作系统。真正的应用程序使用线程池来处理这种情况。