Java套接字编程之TCP编程

Java套接字编程之TCP编程 1 TCP协议

TCP是面向谅解的协议。所谓连接,就是两个对等实体为进行数据通信而进行的一种结合。面向连接服务是在数据交换之前,必须先建立连接。当数据交换结束后,则应终止这个连接。

面向连接服务具有:连接建立、数据传输和连接释放这三个阶段。在传送数据时是按序传送的。

当一台计算机需要与另一台远程计算机连接时,TCP协议会让他们建立一个连接:用于发送和接收数据的虚拟链路。TCP协议负责收集信息包,并将其按适当的次序放好传送,在接收端收到后再将其正确的还原。为了保证数据包在传送中准确无误,TCP使用了重发机制:当一个通信实体发送一个消息给另一个通信实体后需要收到另一个实体的确认信息,如果没有收到确认信息,则会再次重发刚才发送的信息。

TCP通信分为客户端和服务器端,对应的对象是分别是Socket和ServerSocket。

Socket类是java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信。Socket类的方法会建立和销毁连接,设置各种Socket选项。

ServerSocket类是java执行服务器端操作的基础类,该类运行于服务器,监听入栈TCP连接,每个socket服务器监听服务器的某个端口,当远程主机的客户端尝试连接此端口时,服务器就被唤醒,并返回一个表示两台主机之间socket的正常的Socket对象。

ServerSocket和Socket通信流程:

Java套接字编程之TCP编程

2 ServerSocket 2.1 构造函数 ServerSocket()throws IOException ServerSocket(int port)throws IOException ServerSocket(int port, int backlog)throws IOException ServerSocket(int port, int backlog, InetAddress bindAddr)throws IOException

在以上构造方法中,参数port指定服务器要绑定的端口(服务器要监听的端口),参数backlog指定客户端连接请求队列的长度,参数bindAddr指定服务器要绑定的IP地址。

2.1.1 绑定端口

除了第一个不带参数的构造方法以外,其他构造方法都会使服务器与特定的端口绑定,该端口由参数port指定。例如,ServerSocket serverSocket = new SererSocket(80);
如果运行时无法绑定到80端口,以上代码会抛出IOException,更确切地说,是抛出BindException,它是IOException的子类。BindException一般由以下原因造成:

端口已经被其他服务器进程占用;

在某些操作系统中,如果没有以超级管理员用户身份来运行服务器程序,那么操作系统不允许服务器绑定到1~1023之间的端口。

如果把port设置为0,表示由操作系统来为服务器分配一个任意可用的端口。由操作系统分配的端口也称为匿名端口。对于多数服务器,会使用明确的端口,而不会使用匿名端口,因为客户程序需要事先知道服务器的端口,才能方便的访问服务器。在某些场合,匿名端口有着特殊的用途。

2.1.2 设定客户端连接请求队列的长度

当服务器进程运行时,可能会同时监听到多个客户端的连接请求。例如,每当一个客户端进程执行以下代码:
Socket sock = new Socket("192.168.32.105",80);
就意味着在远程主机的80端口上,监听到一个客户端的连接请求。管理客户端请求的任务是由操作系统完成的。操作系统把这些请求连接存储在一个先入先出的队列中。许多操作系统限定了队列的最大长度,一般为50.当队列中的连接请求达到队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求。只有当服务器进程通过ServerSocket的accept()方法从队列中取出连接请求,使队列腾出空位时,队列才能继续加入新的连接请求。

对于客户进程,如果它发出的连接请求被加入到服务器的队列中,就意味着客户端与服务器的连接建立成功,客户进程从Socket构造方法中正常返回。如果客户进程发出的连接请求被服务器拒绝,Socket构造方法会抛出ConnectionException。

ServerSocket构造方法的backlog参数用来显式设置连接请求队列的长度,它将覆盖操作系统限定的队列的最大长度。在以下几种情况中,仍然会采用操作系统限定的队列的最大长度:

backlog参数的值大于操作系统限定的队列的最大长度;

backlog参数的值小于或者等于0;

在ServerSocket构造方法中没有指定backlog。

2.1.3 设定绑定IP地址

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/465966d9ed8859b6ae878cfdb1cfa975.html