Java网络编程核心技术详解(视频微课版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.4 获取ServerSocket的信息

ServerSocket的以下两个get方法分别用于获得服务器绑定的IP地址,以及绑定的端口。

前面已经讲到,在构造ServerSocket时,如果把端口设为0,那么将由操作系统为服务器分配一个端口(称为匿名端口),程序只要调用getLocalPort()方法就能获知这个端口号。例程3-3的RandomPort创建了一个ServerSocket,它使用的就是匿名端口。

例程3-3 RandomPort.java

多次运行RandomPort程序,可能会得到如下运行结果。

多数服务器会监听固定的端口,这样才便于客户程序访问服务器。匿名端口一般适用于服务器与客户之间的临时通信,通信结束后就断开连接,并且ServerSocket占用的临时端口也会被释放。

FTP就使用了匿名端口。如图3-1所示,FTP用于在本地文件系统与远程文件系统之间传送文件。

图3-1 FTP用于在本地文件系统与远程文件系统之间传送文件

FTP使用两个并行的TCP连接:一个是控制连接,一个是数据连接。控制连接用于在客户和服务器之间发送控制信息,例如用户名和口令、改变远程目录的命令,或上传和下载文件的命令。数据连接用于传送文件。TCP服务器在21端口上监听控制连接,如果有客户要求上传或下载文件,就另外建立一个数据连接,通过它来传送文件。数据连接的建立有两种方式。

(1)如图3-2所示,TCP服务器在20端口上监听数据连接,TCP客户主动请求建立与该端口的连接。

图3-2 TCP服务器在20端口上监听数据连接

(2)如图3-3所示,首先由TCP客户创建一个监听匿名端口的ServerSocket,TCP客户再把这个ServerSocket监听的端口号(调用ServerSocket的getLocalPort()方法就能得到端口号)发送给TCP服务器,然后由TCP服务器主动请求建立与客户端的连接。

图3-3 TCP客户在匿名端口上监听数据连接

以上第2种方式就使用了匿名端口,并且是在客户端使用的,用于和服务器建立临时的数据连接。在实际应用中,在服务器端也可以使用匿名端口。