Java 客户端似乎已连接,而服务器未接受它

Java 客户端似乎已连接,而服务器未接受它,java,sockets,Java,Sockets,我试图说明套接字服务器和客户端的一个问题,其中服务器一次只能处理一个客户端,因此多个客户端必须相互等待 这是我的服务器类。我可以接受来自一个客户端的连接,读取一些字符串,大写并发送回。然后,下一个客户将得到服务。因此,如果启动多个客户端,第一个客户端将连接,但其余客户端将不得不等待服务器再次调用accept()。这是假设 System.out.println(“启动服务器…”); 试一试{ ServerSocket welcomeSocket=新的ServerSocket(2910); whil

我试图说明套接字服务器和客户端的一个问题,其中服务器一次只能处理一个客户端,因此多个客户端必须相互等待

这是我的服务器类。我可以接受来自一个客户端的连接,读取一些字符串,大写并发送回。然后,下一个客户将得到服务。因此,如果启动多个客户端,第一个客户端将连接,但其余客户端将不得不等待服务器再次调用accept()。这是假设

System.out.println(“启动服务器…”);
试一试{
ServerSocket welcomeSocket=新的ServerSocket(2910);
while(true){
套接字=welcomeSocket.accept();
System.out.println(“客户端连接”);
ObjectInputStream INFOROMClient=新的ObjectInputStream(socket.getInputStream());
字符串o=(字符串)inFromClient.readObject();
系统输出打印项次(“接收:+o”);
字符串应答=o.toUpperCase();
ObjectOutputStream outToClient=新的ObjectOutputStream(socket.getOutputStream());
System.out.println(“发回:+应答”);
outToClient.writeObject(应答);
}
}捕获(IOException | ClassNotFoundException e){
//插座坏了
}
这是我的客户代码:

试试看{
套接字=新套接字(“localhost”,2910);
System.out.println(“连接到服务器”);
ObjectOutputStream outToServer=新的ObjectOutputStream(socket.getOutputStream());
扫描仪输入=新扫描仪(系统输入);
System.out.println(“发送什么?”);
字符串toSend=in.nextLine();
System.out.println(“发送”+toSend);
outToServer.writeObject(toSend);
ObjectInputStream INFOROMSERVER=新的ObjectInputStream(socket.getInputStream());
字符串o=(字符串)informserver.readObject();
系统输出打印项次(“接收:+o”);
}catch(IOException | ClassNotFoundException e){}
我创建到服务器的连接,然后从控制台读取。第一个客户端应成功连接,然后打印“已连接到服务器”。在服务器调用accept()之前,其他客户端应该一直在创建套接字。至少我是这么想的

但我所有的客户机都打印出“连接到服务器”,我可以在控制台中为所有客户机键入,然后发送到服务器。然后,服务器仍将一次响应一个客户端


但是,为什么在服务器接受连接之前,客户端代码会从初始连接开始移动?java 8中似乎是这样,但现在我使用java 11。

如果要防止操作系统在调用accept()之前接受多个连接,请将
backlog设置为1

否则,在调用accept()之前,操作系统通常会接受多达5个连接。客户机相信是连接的,因为它们确实是在TCP/IP级别连接的


请参阅文档:

公共服务器套接字(int端口), int积压工作) 抛出IOException 创建服务器套接字并将其绑定到指定的本地端口号,以及指定的待办事项。端口号0表示自动分配端口号,通常从临时端口范围分配。然后可以通过调用getLocalPort检索此端口号。 传入连接指示(连接请求)的最大队列长度设置为backlog参数。如果连接指示在队列已满时到达,则连接将被拒绝

如果应用程序指定了服务器套接字工厂,则调用该工厂的createSocketImpl方法来创建实际的套接字实现。否则将创建一个“普通”套接字

如果存在安全管理器,则调用其checkListen方法,并将端口参数作为其参数,以确保允许该操作。这可能会导致SecurityException。backlog参数是套接字上请求的最大挂起连接数。它的确切语义是特定于实现的。具体而言,实现可以施加最大长度,或者可以选择忽略参数altogther。提供的值应大于0。如果小于或等于0,则将使用特定于实现的默认值

参数: 端口-端口号,或0以使用自动分配的端口号。 积压工作-请求的传入连接队列的最大长度