【问题标题】:How client know which socket connect to?客户端如何知道连接到哪个套接字?
【发布时间】:2012-09-12 04:06:10
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading sockets


    【解决方案1】:

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

    【讨论】:

    • 这不是我要的。我想知道客户端如何知道它将在服务器端连接哪个套接字?因为服务器程序创建了多个线程来做到这一点。
    • @GMsoF 这是一个完全合理的答案,因为您提出的问题实际上没有意义。
    【解决方案2】:

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

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

    【讨论】:

    • 我看到一篇文章说我们可以从一个端口创建多个套接字。 stackoverflow.com/questions/700594/… 这就是我感到困惑的原因。但你的观点也有道理。如何解读这件事?
    • 我现在越来越困惑,对于我的示例代码,它完全遵循“一个进程在一个端口上运行”的 TCP/IP 规则,尽管它创建了多个线程来执行此操作...... .
    • @GMsoF 服务器可以从单个侦听端口接受任意数量的套接字。你的服务器不这样做。 TCP 中没有“一个进程一个端口”这样的规则。如果这样做,服务器将无法编写。
    • 好的,我想我差不多明白了。请允许我再问一个问题。如果我有一个程序“A”在端口 1111 上侦听,然后一个客户端成功连接到在程序 A 中创建的套接字 A。虽然套接字 A 被保留(通信仍在进行,但程序 A 没有在端口 1111 上侦听再说了,一个socket就够了),可以编程B监听端口1111并尝试在socket A仍然打开的情况下在端口1111下创建一个socket B吗?
    • @GMsoF 是的,但有困难。这是一件非常奇怪的事情。程序必须合作才能知道 B 何时可以开始收听,并且客户端也必须合作,以便希望连接到 A 的程序在希望连接到 B 的程序之前运行。合并服务器更有意义。一个端口只能用于一个协议。我认为这就是您上面引用的“规则”的含义。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2015-02-08
      • 1970-01-01
      • 2011-04-21
      • 2021-02-03
      相关资源
      最近更新 更多