Java 客户端如何知道连接到哪个套接字?

Java 客户端如何知道连接到哪个套接字?,java,multithreading,sockets,Java,Multithreading,Sockets,我正在使用Java进行套接字编程,如下所示 客户端程序如下所示: Socket MyClient; try { MyClient = new Socket("Machine name", PortNumber); } catch (IOException e) { System.out.println(e); } ServerSocket MyService; try { MyServerice =

我正在使用Java进行套接字编程,如下所示

客户端程序如下所示:

 Socket MyClient;
    try {
           MyClient = new Socket("Machine name", PortNumber);
    }
    catch (IOException e) {
        System.out.println(e);
    }
ServerSocket MyService;
    try {
       MyServerice = new ServerSocket(PortNumber);
        }
        catch (IOException e) {
           System.out.println(e);
        }

Socket clientSocket = null;
    try {
       clientSocket = MyService.accept();
        }
    catch (IOException e) {
       System.out.println(e);
    }
服务器程序如下:

 Socket MyClient;
    try {
           MyClient = new Socket("Machine name", PortNumber);
    }
    catch (IOException e) {
        System.out.println(e);
    }
ServerSocket MyService;
    try {
       MyServerice = new ServerSocket(PortNumber);
        }
        catch (IOException e) {
           System.out.println(e);
        }

Socket clientSocket = null;
    try {
       clientSocket = MyService.accept();
        }
    catch (IOException e) {
       System.out.println(e);
    }

现在我的问题是,如果我运行多个线程来打开一个端口中的多个套接字(如上面的服务器代码),我的客户端程序如何知道它连接到哪个套接字?

您的客户端连接到服务器端口。因此,所有客户端都将具有相同的代码
MyClient=newsocket(“机器名”)
在客户端打开的端口并不重要。客户端将在其操作系统中获得可用的免费端口。

您的客户端将连接到服务器端口。因此,所有客户端都将具有相同的代码
MyClient=newsocket(“机器名”)
在客户端打开的端口并不重要。客户端将在其操作系统中获得可用的免费端口

我的客户端程序如何知道它连接到哪个套接字

这个问题没有意义。它根本不“连接到套接字”,它连接到侦听端口,并且只有一个端口。您的服务器只接受一个客户机,因此第二个线程和后续线程将获得未定义的行为,范围从ConnectException到ConnectionException再到nothing,很可能是后者

我的客户端程序如何知道它连接到哪个套接字


这个问题没有意义。它根本不“连接到套接字”,它连接到侦听端口,并且只有一个端口。您的服务器只接受一个客户机,因此第二个线程和后续线程将获得未定义的行为,范围从ConnectException到ConnectionException再到nothing,很可能是后者

您的应用程序知道它,因为您使用特定端口设置了它。TCP/IP中没有内置的“自动发现”,这取决于您选择一个服务器端口,并确保您将客户端设置为连接到该端口。要么将其硬编码到客户机应用程序中,要么将其保存在客户机附带的某个配置文件中


这就是为什么您有一堆“已知端口”,比如http是端口80。这意味着浏览器将始终连接到web服务器上的端口80,除非您在URL中明确指出另一个端口。

您的应用程序知道它,因为您使用特定端口进行了设置。TCP/IP中没有内置的“自动发现”,这取决于您选择一个服务器端口,并确保您将客户端设置为连接到该端口。要么将其硬编码到客户机应用程序中,要么将其保存在客户机附带的某个配置文件中


这就是为什么您有一堆“已知端口”,比如http是端口80。这意味着浏览器将始终连接到web服务器上的端口80,除非您在URL中明确指出另一个端口。

我看到一些文章说,我们可以从一个端口创建多个套接字。这就是我感到困惑的原因。但你的观点也有道理。如何解释这件事?我现在更困惑了,对于我的示例代码,它完全遵循TCP/IP规则,即“一个进程在一个端口上运行”,尽管它创建了多个线程来实现这一点……@GMsoF服务器可以从单个侦听端口接收任意多个套接字。你的服务器不这样做。TCP中没有“一个进程一个端口”这样的规则。如果你这么做了,服务器就不可能写了。好吧,我想我差不多明白了。请允许我再问一个问题。如果在一个客户端成功连接到程序a中创建的套接字a之后,我有一个程序“a”在端口1111上侦听。当套接字a保持时(通信仍在进行,但程序a不再侦听端口1111,一个套接字就足够了),程序B是否可以监听端口1111,并在端口1111下创建一个套接字B,而套接字a仍处于打开状态?@GMsoF是,但有困难。这是一件很奇怪的事。程序必须合作才能知道B何时可以开始监听,客户端也必须合作,以便预期连接到A的程序在预期连接到B的程序之前运行。将服务器组合起来会更有意义。一个端口只能用于一个协议。我想这就是你上面提到的“规则”的含义。我看到一些文章说我们可以从一个端口创建多个套接字。这就是我感到困惑的原因。但你的观点也有道理。如何解释这件事?我现在更困惑了,对于我的示例代码,它完全遵循TCP/IP规则,即“一个进程在一个端口上运行”,尽管它创建了多个线程来实现这一点……@GMsoF服务器可以从单个侦听端口接收任意多个套接字。你的服务器不这样做。TCP中没有“一个进程一个端口”这样的规则。如果你这么做了,服务器就不可能写了。好吧,我想我差不多明白了。请允许我再问一个问题。如果在一个客户端成功连接到程序a中创建的套接字a之后,我有一个程序“a”在端口1111上侦听。当套接字a保持时(通信仍在进行,但程序a不再侦听端口1111,一个套接字就足够了),程序B是否可以监听端口1111,并在端口1111下创建一个套接字B,而套接字a仍处于打开状态?@GMsoF是,但有困难。这是一件很奇怪的事。程序必须合作才能知道B何时可以开始监听,客户端也必须合作,以便预期连接到A的程序在预期连接到B的程序之前运行。将服务器组合起来会更有意义。一个端口只能用于一个协议。我想这就是你上面提到的“规则”的含义。这不是我要问的。我想知道客户端如何知道它将在服务器端连接哪个套接字?因为服务器程序会创建多个线程来执行此操作。@GMsoF这是一个per