您的位置:首页 > 编程语言 > Java开发

Java-Socket通信

2016-03-28 20:52 423 查看
TCP  Socket 通信模型



Java为TCP协议提供了两种类:Socket类和ServerSocket。一个Socket实例代表了TCP链接的一端,一个TCP链接是一条抽象的双向信道,两端分别由IP地址和端口号确定。在开始通信之前,要建立一个TCP链接,这需要现有客户端TCP向服务器端TCP发送请求。服务器端要同时处理ServerSocket实例和socket实例,而客户端只需要使用Socket实例。

TCP客户端:

客户端向服务器发送请求后,就被动地等待服务器的响应。

1、创建一个Socket实例:构造函数向指定的远程主机和端口号建立一个TCP链接。

2、通过套接字的输入输出流(I/O streams)进行通信:一个Socket链接实例包括一个InputStream和一个OutputStream

3、使用socket 类的close()方法关闭链接。

TCP服务器端

建立一个通信终端,并被动地等待客户端的链接。

1、创建一个ServerSocket实例并指定本地端口。此套接字的功能是侦听该指定端口收到的链接。

2、重复执行:

a.调用ServerSocket的accept()方法以获取一个客户端的连接。基于新建立的客户端连接,创建一个Socket实例,并由accept()方法返回。

b.使用所返回的Socket实例的InputStream和OutputStream与客户端进行通信。

c.通信完成后,使用Socket类的close()方法关闭该客户端套接字的链接。

UDP的两个类为:DatagramPacket类和DatagramSocket类来使用UDP套接字。客户端和服务器端都使用DatagramSocket类来发送数据,使用DatagramPacket类来接收数据。

UDP客户端

1、创建一个DatagramSocket实例,可以选择对本地地址和端口号进行设置

2、使用DtagramSocket类的send()和receive()方法来发送和接收DatagramPacket实例,进行通信

3、通信完成后,使用DtagramSocket类的close()方法来销毁该套接字。

由于UDP连接是不可靠的,如果使用像TCP的socket的receive()方法,客户端可能永久阻塞,为了避免这个问题,在客户端使用DtagramSocket类的setSoTimeout()方法来指定receive()方法的最长阻塞时间。如果超过指定时间扔没有得到相应,客户端就会重发回馈请求。执行以下步骤:

1、向服务器发送回馈字符串

2、在receive()方法上最多阻塞等待3秒钟,在超时前若没有收到相应,则重发请求(最多重发5次)

3、终止客户端

UDP服务器端

1、创建DtagramSocket的实例,指定本地端口号,并可以选择指定本地地址,此时,服务器已经准备好从任何客户端接收数据报文

2、使用DtagramSocket类的receive()方法来接收一个DatagramPacket实例。但receive()方法返回时,数据报文就包含了客户端的地址,这样我们就知道回复信息应该发送到哪里

3、使用DtagramSocket类的send()和receive()方法来发送和接收DatagramPackets实例,进行通信。

                                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java Socket