socket网络编程教程(socket 编程)(4)

http://www.itjxue.com  2023-02-09 03:27  来源:未知  点击次数: 

例程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秒钟。

(责任编辑:IT教学网)

更多

推荐测评专题文章