Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的多线程服务器程序_Java_Sockets_Network Programming - Fatal编程技术网

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

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

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中(只要内部数据吞吐量优于网络中的吞吐量,这是性能更高的选项)

玩得开心