![](/img/trans.png)
[英]is it legal to create two socket connection to same port with two threads
[英]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.