socket网络编程教程(socket 编程)(4)
例程3-3 RandomPort.java
import java.io.*;
import java.net.*;
public class RandomPort{
public static void main(String args[])throws IOException{
ServerSocket serverSocket=new ServerSocket(0);
System.out.println("监听的端口为:"+serverSocket.getLocalPort());
}
}
多次运行RandomPort程序,可能会得到如下运行结果:
C:\chapter03\classesjava RandomPort
监听的端口为:3000
C:\chapter03\classesjava RandomPort
监听的端口为:3004
C:\chapter03\classesjava RandomPort
监听的端口为:3005
多数服务器会监听固定的端口,这样才便于客户程序访问服务器。匿名端口一般适用于服务器与客户之间的临时通信,通信结束,就断开连接,并且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,再把这个ServerSocket监听的端口号(调用ServerSocket的getLocalPort()方法就能得到端口号)发送给TCP服务器,然后由TCP服务器主动请求建立与客户端的连接。
图3-3 TCP客户在匿名端口上监听数据连接
以上第二种方式就使用了匿名端口,并且是在客户端使用的,用于和服务器建立临时的数据连接。在实际应用中,在服务器端也可以使用匿名端口。
3.5 ServerSocket选项
ServerSocket有以下3个选项。
◆SO_TIMEOUT:表示等待客户连接的超时时间。
◆SO_REUSEADDR:表示是否允许重用服务器所绑定的地址。
◆SO_RCVBUF:表示接收数据的缓冲区的大小。
3.5.1 SO_TIMEOUT选项
◆设置该选项:public void setSoTimeout(int timeout) throws SocketException
◆读取该选项:public int getSoTimeout () throws IOException
SO_TIMEOUT表示ServerSocket的accept()方法等待客户连接的超时时间,以毫秒为单位。如果SO_TIMEOUT的值为0,表示永远不会超时,这是SO_TIMEOUT的默认值。
当服务器执行ServerSocket的accept()方法时,如果连接请求队列为空,服务器就会一直等待,直到接收到了客户连接才从accept()方法返回。如果设定了超时时间,那么当服务器等待的时间超过了超时时间,就会抛出SocketTimeoutException,它是InterruptedException的子类。
如例程3-4所示的TimeoutTester把超时时间设为6秒钟。