2011-12-01 55 views
5

我正在尝试在Java中编写一个多线程程序,其中服务器侦听来自客户端的连接并生成一个线程来完成每个客户端。我有:Java中的多线程服务器程序

while(true) 
    { 
     Socket s = server.accept();  
     ClientHandler ch = new ClientHandler(s); 
     Thread t = new Thread(ch); 
     t.start(); 
    } 

我的问题是:每当接受

Socket s = server.accept(); 

的连接,并开始执行下面的代码行来创建线程等,会发生什么情况的请求,从连接在此期间的客户。它是否以某种方式排队,它将在下一个循环while(true)中得到处理,还是会被拒绝?

感谢, 尼科斯

回答

4

accept()返回后的TCP握手完成,你必须(在你的代码s)连接的客户端套接字。在下一次调用accept()之前,操作系统会将挂起的连接请求排队。

例如,您可能想查看一些教程,如this one

0

它已经被回答了:是的,它已经排队,没有被拒绝。

我认为任何人阅读这个问题首先要知道,当你实例化一个插座:

server = new ServerSocket(mPort, mNusers); 

的Java已经实施network socket;其中有明确定义的行为。然而,在达到极限设置后连接将被拒绝。

此外,张贴在讨论的代码接受多个连接但失去了REFFERENCE前一个。这可能是一个“嘟嘟”,但为了防止有人复制粘贴,你应该做一些事情来存储所有创建的套接字或处理程序。也许:

ClientHandler[] ch = new ClientHandler[mNusers]; 
int chIndex = 0; 
while(true) 
    { 
     Socket s = server.accept();  
     ch[chIndex] = new ClientHandler(s); 
     Thread t = new Thread(ch); 
     t.start(); 
     chIndex++; 
    } 

阵列未必是最好的选择,但我想指出的是,与插座你应该知道什么是连接你将分配限制

1

我用Java写的a tiny http server,你可以在github上找到。这可能是一个很好的例子,让你看看实际使用套接字和多线程的情况。

0

啊:)

有一个所谓的SYN队列,这会占用到尚未建立​​的连接(所请求数量是有每个呼叫和系统级的限制 - 不知道,如果它连用户限制)。

当在一个ServerSocket上“侦听”时,您指定的答案之一是“Nusers”,但它是 - 套接字应该保留的“积压”的大小。在这个待办事项中,挂起的连接被存储,如果它被填满,所有其他(应该)得到ConnectionRefused。

所以

a)增加,当你要慢慢接受(服务器。接受使用线程池()) 连接

b)中接受连接快通过

B.1)(快乐移动问题到OS的上下文开关)

B.2)使用NIO,并与该处理套接字状态 根单丝内/ CPU的能力(只要内部数据吞吐量是一个比网络更好,这是更好的性能选项)

乐趣