繁体   English   中英

两个线程可以在同一个端口中调用一个新的套接字(客户端套接字)吗?

[英]Can two threads call a new socket (client socket) in the same port?

如果一个线程实例化一个新的客户端套接字,而另一个线程正在处理连接到同一端口的另一个客户端套接字,应该怎么办? 该线程是同一Java程序的一部分。

不确定是否询问客户端或服务器套接字。 但是我都会回答。 如果尝试在同一端口上打开侦听服务器套接字,则会java.net.BindException thrown: Address already in use (Bind failed)或类似的东西。 如果要连接到端口-如果服务器接受多个客户端,则可以正常工作。

并且是相同的线程,不同的线程还是另一个进程都没有关系。

Socket具有两个端口- 本地端口远程端口 TCP规范中,这些端口称为源端口目标端口

连接到服务器时,您可以指定主机名和(远程)端口。 服务器需要知道将响应发送到哪里,这就是为什么客户端还将有一个(本地)端口的原因。 本地端口由操作系统从可用端口池中分配。

尝试以下代码示例:

import java.io.IOException;
import java.net.Socket;

public class SocketTest {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            final int j = i;
            new Thread(() -> {
                try {
                    Thread.sleep(100 * j);
                    try (Socket socket = new Socket("stackoverflow.com", 80)) {
                        System.out.printf("%d -> %d%n", socket.getLocalPort(), socket.getPort());
                    }
                } catch (InterruptedException | IOException ignored) {}
            }).start();
        }
    }
}

我的机器上一次执行的输出如下所示:

36699 -> 80
36700 -> 80
36701 -> 80
36703 -> 80
36708 -> 80
36709 -> 80
36710 -> 80
36712 -> 80
36713 -> 80
36714 -> 80

本地端口通常每次都会变化。

结论:客户端不在乎有多少套接字连接到同一远程地址。 本地端口之间也不会发生任何冲突。

进一步阅读:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM