Java-Socket通信
2016-03-28 20:52
423 查看
TCP Socket 通信模型
![](https://img-blog.csdn.net/20160328205256818?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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为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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Linux socket 初步
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序