当我使用ServerSocket类的accept方法时,谁知道如何选择端口?是否可以为方法可以选择的端口定义范围?我可以按顺序一个接一个地使用端口吗?

ServerSocket sSocket = new ServerSocket(5050);
Socket socket = sSocket.accept();

最佳答案

该图不正确(已在O'Reilly网站上的unconfirmed errata中列出)。

客户端随机选择其端口(您不需要在Java中做任何特殊的事情),然后在您指定的任何端口上连接到服务器。使用netstat命令行工具,您可以看到此信息。

首先,只有没有客户端的监听服务器套接字:

simon @ lucifer:〜$ netstat -n -a
Activity 的Internet连接(包括服务器)
Proto Recv-Q Send-Q本地地址外部地址(状态)
...
tcp46 0 0 * .5050 *。*听
...

(还有很多其他条目,我刚刚删除了不相关的条目)

现在有一个从本地主机(127.0.0.1)连接的客户端:

simon @ lucifer:〜$ netstat -n -a
Activity 的Internet连接(包括服务器)
Proto Recv-Q Send-Q本地地址外部地址(状态)
...
tcp4 0 0 127.0.0.1.64895 127.0.0.1.5050已建立tcp4 0 0 127.0.0.1.5050 127.0.0.1.64895已建立tcp46 0 0 * .5050 *。*监听...

由于客户端是从同一台计算机连接的,因此我们看到两个已建立的连接-一个从客户端到服务器(1),另一个从服务器到客户端(2)。它们具有相反的本地和外部地址(因为它们正在互相通信),您可以看到服务器仍在使用端口5050,而原始服务器套接字(3)继续在同一端口上监听。

(此输出来自Mac,但Windows/Linux也具有netstat提供类似的输出)

10-08 01:27