Java套接字:同一台机器上同一端口上的多个客户端线程?

esp*_*upt 18 java sockets port relationship

我是Java中Socket编程的新手,并试图理解下面的代码是不是错误的做法.我的问题是:

我可以在每个线程上尝试连接到同一程序中的服务器实例的多个客户端,并期望服务器在客户端之间隔离地读取和写入数据"

public class Client extends Thread
{
    ...
    void run()
    {
        Socket socket = new Socket("localhost", 1234);
        doIO(socket);  
    }
}

public class Server extends Thread
{
    ...
    void run()
    {
        // serverSocket on "localhost", 1234
        Socket clientSock = serverSocket.accept();
        executor.execute(new ClientWorker(clientSock));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以在不同的线程上尝试连接当前机器的同一端口上的多个客户端实例吗?

例如,

   Server s = new Server("localhost", 1234);
   s.start();
   Client[] c = new Client[10];
   for (int i = 0; i < c.length; ++i)
   {
        c.start();
   }
Run Code Online (Sandbox Code Playgroud)

pat*_*ros 10

是的,但是只有一个客户端能够按写入的每个线程执行连接.

您可以将服务器run()放在while循环中,让多个客户端连接起来.根据执行程序,它们将以串行或并行方式执行.

   public class Server extends Thread  
   {  
       ...  
       void run()  
       {  
           while(true){
              // serverSocket on "localhost", 1234  
              Socket clientSock = serverSocket.accept();  
              executor.execute(new ClientWorker(clientSock));  
           }
       }  
   } 
Run Code Online (Sandbox Code Playgroud)


Jhe*_*ico 4

只要只有一个对象尝试绑定端口进行侦听,那么多个客户端连接就没有问题。

  • 端口只是一个数字。它不对应于任何物理事物。*连接*由元组{协议、源地址、源端口、目标地址、目标端口}定义。客户端操作系统将负责确保每个传出连接具有不同的出站端口号。因此,对同一目标主机/端口有多个入站连接是没有问题的,即使它们全部来自同一客户端源主机。 (5认同)