ServerSocket accept()方法

Eug*_*ene 11 java

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

ServerSocket sSocket = new ServerSocket(5050);
Socket socket = sSocket.accept();
Run Code Online (Sandbox Code Playgroud)

从书中

Sim*_*onJ 23

该图表不正确(并列在O'Reilly网站上未经证实的勘误表中).

客户选择它的端口随机(你不需要做任何事情在Java中特殊),并连接到哪个端口指定的服务器.使用netstat命令行工具,您可以看到 - 首先,只是没有客户端的侦听服务器套接字:

simon@lucifer:~$ netstat -n -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address     (state)
...
tcp46      0      0  *.5050                 *.*                 LISTEN
...

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

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

simon@lucifer:~$ netstat -n -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address     (state)
...
tcp4       0      0  127.0.0.1.64895        127.0.0.1.5050      ESTABLISHED <- 1
tcp4       0      0  127.0.0.1.5050         127.0.0.1.64895     ESTABLISHED <- 2
tcp46      0      0  *.5050                 *.*                 LISTEN      <- 3
...

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

(这些来自Mac,但Windows/Linux也netstat提供类似的输出)

  • @chs_Infinity我不确定你在问什么.服务器套接字继续使用端口5050,以便新客户端可以连接到它.新连接使用服务器端的端口5050,因为这是协议的定义方式.它_possible_的原因是连接的"身份"基于5元组:(源IP,源端口,目标IP,目标端口,协议(tcp或udp)).更改一个字段(通常是源端口)足以产生新的,不同的连接. (5认同)

use*_*421 6

当您说新的ServerSocket(5050)时,选择了端口.关于为接受的套接字使用不同端口的所有内容都是100%BS.