我正在尝试用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)
的下一个循环中提供,还是会被拒绝?
感谢, 尼科斯
答案 0 :(得分:4)
accept()
返回后,TCP握手完成,并且您的代码中有一个连接的客户端套接字(s
)。在下一次调用accept()
之前,操作系统会将挂起的连接请求排队。
您可能需要查看一些教程,例如this one。
答案 1 :(得分:1)
我在Java中编写了a tiny http server,您可以在github上找到它。这可能是一个很好的例子,让您了解套接字和多线程的实际使用情况。
答案 2 :(得分:0)
正如已经回答的那样:是的,它已排队,不会被拒绝。
我认为阅读此问题的任何人都应该首先知道实例化套接字时:
server = new ServerSocket(mPort, mNusers);
Java已经实现了network socket;它有明确的行为。但是在达到限制设置后,连接将被拒绝。
,问题中发布的代码接受多个连接,但会丢失之前的参考。这可能是一个“duh”,但万一有人复制粘贴,你应该做一些事情来存储所有创建的套接字或处理程序。也许:
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++;
}
数组可能不是最好的选择但是我想指出,使用套接字你应该知道你将分配的连接限制
答案 3 :(得分:0)
嗯:)
有一个所谓的SYN队列,它占用了所请求数量的尚未建立的连接(每个呼叫和系统范围的限制 - 不确定它的用户是否受限制。)
当在ServerSocket上“监听”时,你指定 - 其中一个答案是“Nusers”,但它是 - 套接字应该保留的“backlog”的大小。在此backlog中存储挂起的连接,如果已填满,则所有其他(应该)将获得ConnectionRefused。
所以
a)当你要慢慢接受时(server.accept())增加 连接
b)通过
更快地接受连接b.1)使用ThreadPool(乐于将问题转移到操作系统的上下文切换)
b.2)使用NIO并具有处理套接字状态的能力 在单线程/ CPU中(只要内部数据吞吐量优于网络中的数据吞吐量,这是更高性能的选项)
玩得开心