Java中的多线程服务器程序
我正试图用Java编写一个多线程程序,其中服务器侦听来自客户端的连接,并生成一个线程来压缩每个客户端。我有:Java中的多线程服务器程序,java,sockets,network-programming,Java,Sockets,Network Programming,我正试图用Java编写一个多线程程序,其中服务器侦听来自客户端的连接,并生成一个线程来压缩每个客户端。我有: while(true) { Socket s = server.accept(); ClientHandler ch = new ClientHandler(s); Thread t = new Thread(ch); t.start(); } 我的问题是:每当它在 Socket s = ser
while(true)
{
Socket s = server.accept();
ClientHandler ch = new ClientHandler(s);
Thread t = new Thread(ch);
t.start();
}
我的问题是:每当它在
Socket s = server.accept();
并开始执行以下代码行来创建线程等,在这段时间内客户端的连接请求会发生什么情况。它是否以某种方式排队,并将在的下一个循环中得到服务,而(true)
是否会被拒绝
谢谢,
Nikos在accept()
返回TCP握手完成后,您拥有一个连接的客户端套接字(s
)。在下一次调用accept()
之前,操作系统将排队等待连接请求
您可能想查看一些教程,例如。,因为它已经得到了回答:是,它已排队,否,它未被拒绝 我认为任何阅读此问题的人都应该首先知道,当您实例化套接字时:
server = new ServerSocket(mPort, mNusers);
Java已经实现了一个;有明确定义的行为。但是,在达到设置的限制后,连接将被拒绝
同样,问题中发布的代码接受多个连接,但取消了前一个问题的引用。这可能是一个“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++;
}
数组可能不是最好的选择,但我想指出的是,对于套接字,您应该知道您将分配的连接限制是多少,这是我用Java编写的,您可以在github上找到。这可能是一个很好的示例,让您了解套接字和多线程的实际使用情况 ugh:)
有一个所谓的SYN队列,它占用了所请求的尚未建立的连接数量(有一个每次调用和一个系统范围的限制-不确定它的用户是否有限)
当在ServerSocket上“侦听”时,您可以通过以下方式指定-其中一个答案是“Nusers”,但实际上是-套接字应该保持的“backlog”大小。在此积压中,将存储挂起的连接,如果已填充,则所有其他(应)连接将被拒绝
所以
a) 当您要慢慢接受时,增加该值(server.accept())
联系
b) 以更快的速度接受连接
b、 1)使用线程池(高兴地将问题转移到操作系统的上下文开关)
b、 2)使用NIO并具有处理套接字状态的能力
在单线程/CPU中(只要内部数据吞吐量优于网络中的吞吐量,这是性能更高的选项)
玩得开心