Java服务器套接字的accept()方法返回的客户端套接字。

4
这是一个关于socket的普遍问题。在Java中,如果我有一个绑定到特定端口(比如4444)的ServerSocket,那么它会监听连接请求。accept()方法将阻塞直到接收到连接请求,并返回一个新的Socket以与客户端通信。返回的Socket的远程端点是客户端的IP地址和端口。
然而,我感到困惑的地方在于,返回的Socket的本地端口与监听请求的ServerSocket的端口号相同(在这种情况下为4444)。我以为两个socket不能绑定到同一个端口?返回的Socket不应该是服务器上的另一个端口吗?
2个回答

6

两个ServerSockets不能监听相同的IP地址和端口。可以有两个ServerSockets在不同的IP上监听相同的端口。

两个套接字不能使用相同的本地和远程IP和端口。许多套接字可以使用相同的本地端口,只要远程IP和端口不同即可。


我明白了。那么,理论上,如果我是一个使用两个套接字连接到两个不同服务器的客户端,系统分配的短暂端口可以相同,只要端点不同?我从来没有真正看到过这种情况发生,但理论上它会工作吗? - Pattay
我认为是这样的,但我也从未见过这种情况。 - Peter Lawrey
你在出站连接中看不到它,因为在内核中bind()先于connect()执行,即使是隐式的,当它执行时也不知道连接目标,因此当给定零端口号时,它必须找到一个空闲的本地端口号。 - user207421

0

您不能使用多个套接字在给定的IP:端口组合上进行监听,但是可以存在对同一组合的多个已接受连接。

连接由本地IP地址和端口以及远程IP地址和端口的组合来标识。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接