如果一个线程实例化一个新的客户端套接字,而另一个线程正在处理连接到同一端口的另一个客户端套接字,会发生什么?这个Threads是同一个Java程序的一部分。
答案 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
本地端口通常每次都会有所不同。
总之:客户端并不关心有多少套接字连接到同一个远程地址。本地端口之间也不会发生任何冲突。
进一步阅读: