1

我正在使用 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);
    }

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

4

3 回答 3

3

您的客户端连接到服务器端口。所以所有客户端都将具有相同的代码 MyClient = new Socket("Machine name", <port where server is listening>);
在客户端打开的端口并不重要。客户端将在其操作系统中获得一个可用端口。

于 2012-09-12T04:16:23.043 回答
2

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

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

于 2012-09-12T04:26:29.600 回答
0

您的应用程序知道这一点,因为您使用特定端口对其进行了设置。TCP/IP 中没有内置“自动发现”,您可以选择服务器端口并确保将客户端设置为连接到该端口。您可以将其硬编码到客户端应用程序中,或者更好的是,将其包含在客户端附带的某个配置文件中。

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

于 2012-09-12T06:47:47.543 回答