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

时间:2018-04-05 17:59:45

标签: java multithreading sockets port

如果一个线程实例化一个新的客户端套接字,而另一个线程正在处理连接到同一端口的另一个客户端套接字,会发生什么?这个Threads是同一个Java程序的一部分。

2 个答案:

答案 0 :(得分:0)

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

如果它是相同的线程,不同的线程或其他进程并不重要。

答案 1 :(得分:0)

Socket有两个端口 - 本地端口远程端口。这些在TCP specification中称为源端口目标端口

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

试试这段代码示例:

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

本地端口通常每次都会有所不同。

总之:客户端并不关心有多少套接字连接到同一个远程地址。本地端口之间也不会发生任何冲突。

进一步阅读: