一、概述
基于TCP协议的Socket编程体验之 ——在线客户系统用户登录 | 1、Socket简介 |
2、Socket通信原理 | |
3、Socket类以及ServerSocket类如何使用 | |
4、InetAddress类如何使用 | |
基于UDP协议的Socket编程体验之 ——在线客户系统客户咨询 | 1、DatagramSocket类如何使用 |
2、DatagramPacket类如何使用 |
1、TCP:Transmission Control Protocol传输控制协议,TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成地四层传输层所指定的功能。
类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。
2、UDP:User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中的一种无连接的传输层协议,提供面向事物的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
UDP类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。
3、总结:
这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。由于TCP需要建立专门的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。
4、区别:
TCP | UDP |
由于它是一个面向连接的协议,在Socket之间进行数据传输之前必然要建立连接,所以在TCP中多了一个连接建立的时间。 | 使用UDP时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接 |
TCP没有这方面的限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大量的数据 | 使用UDP传输数据时时有大小限制的,每个被传输的数据报必须限定在64KB之内。 |
TCP在网络同心上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输 | 相比之下,UDP操作简单,而且需要较少的监护,因此通常用于局域网高可靠性的分散系统中的client/server应用程序 |
TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据 | UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。 |
二、学习方法
1、了解Socket的概念、起源、分类等相关知识,只需要听懂并看懂课件中的内容即可。
2、Socket通信原理以及Socket类、ServerSocket类的使用是重点内容
了解DatagramSocket类、DatagramPacket类的使用,看懂并完成任务即可
三、Socket
1、简介:
套接字;应用程序通过“套接字”向网络发出请求或者应答网络请求;
最早是UNIX上的一套网络程序通讯的标准;已被广泛移植到其它平台;
Socket实质上提供了进程通信的端点,网络上的两个程序通过一个双向的通讯链路实现数据的交换,这个双向链路的一端称为一个Socket。
Socket封装了应用层和传输层的功能,不需要我们自己去实现。
实际上Socket就相当于我们现实生活的一个插座,我们根据我们需要的来选取合适的插座。
2、分类:
一共有三类:
(1)流式套接字(SOCK_STREAM):提供了一个面向连接,可靠的数据传输服务,数据无差错、五重复的发送,且按发送顺序接收,其实它对应使用的是TCP协议。
(2)数据报式套接字(SOCK_DGRAM):无连接服务,数据报以独立包形式被发送,不提供无差错保证,数据可能丢失或重复,并且接收顺序无序,其实它对应使用的是UDP协议。
(3)原始式套接字(SOCK_RAM):该接口允许对较低层次协议,如IP直接访问。可以接受本机网卡上的数据帧或数据包,对监听网络流量和分析很有用。
我们主要是学习流式套接字和数据报式套接字。
3、Socket通信原理概述
就相当于打电话一样
四、基于TCP协议的Socket编程
相关的类是Socket类、ServerSocket类,都被封装在java.net包中
1、Socket类
(1)Socket类的构造方法
构造方法 | 说明 |
Socket(String host,int port) | 向host主机的port端口发起连接请求 |
Socket(String host,int port,InetAddress localAddr,int localPort) | 向host主机的port端口发起连接请求,发起请求的计算机为localAddr,端口为localPort |
InetAddress类表示互联网协议地址,包含IP地址,InetAddress类是java对IP地址的封装。
(2)Socket类的常用方法
常用方法 | 说明 |
InetAddress getInetAddress() | 返回与当前Socket对象关联的InetAddress对象 |
void shutdownInput() | 此套接字的输入流置于“流的末尾” |
void shutdownOutput() | 禁用此套接字的输出流 |
InputStream getInputStream() | 返回当前Socket对象关联的InputStream对象,它是服务器端向客户端发送回来的数据流。 |
OutputStream getOutputStream() | 返回当前Socket对象关联的OutputStream对象,它是客户端向服务器端发送的数据流。 |
Void close() | 关闭该Socket对象建立的连接 |
2、ServerSocket类
(1)ServerSocket类的构造方法
构造方法 | 说明 |
ServerSocket() | 创建一个ServerSocket对象。 |
ServerSocket(int port) | 创建一个ServerSocket对象,并绑定到绑定的端口。 |
(2)ServerSocket类的常用方法
常用方法 | 说明 |
Socket accept() | 侦听并接收到此ServerSocket的连接,此方法在连接传入之前一直阻塞。 |
void close() | 是服务器释放占用的资源,并断开所有客户端的连接。 |
InetAddress getInetAddress() | 返回当前服务器绑定的IP地址信息。 |
3、实例
(1)用户登录——字符串方式
Server(服务器端) | 1、创建一个服务器端的Socket(ServerSocket),指定绑定端口,并等待监听; 2、使用accept()方法来阻塞等待监听,获取新的连接;(实际上就是通过该方法获取Socket对象); 3、获取Socket的输入输出流,进行操作(读取并响应客户端请求); 4、关闭资源。 |
Client(客户端) | 1、创建Socket对象,与服务器建立连接; 2、获取输入输出流,进行操作(给服务器端发送请求并获取服务器端的响应信息); 3、关闭资源 |
注意:方法shutdownOutput()和方法shutdownInput(),在客户端发送请求后,使用这两个方法,才能够完成整个的通信(即C与S都进行了请求相关的操作),如果没有这个两个方法中的一个,则整个通信就没完成。但是两个方法所得到的结果是不一样的。
(2)用户登录——对象方式
实际过程跟字符串方式差不多,但是要注意:
① 就是操作对象的流与操作字符串的流是不一样的。操作字符串的读写流我们用的是BufferedReader/PriteWriter,操作对象的读写流我们用的是ObjectInputStream/ObjectOutputStream;
② 还有一点就是要注意我们操作的对象必须是实现了序列化的才行,不然会报错。
(3)用户登录——多客户端
创建一个线程类,放到Server端,就可以实现多个Client访问该Server了。
(4)服务器获取客户端的IP信息
4、总结(Socket编程步骤)
Server(服务器端) | 1、建议一个服务器Socket(ServerSocket)绑定指定端口并开始监听; 2、使用accept()方法阻塞等待监听,获得新的连接; 3、建立输入和输出流; 4、在已有的协议上产生会话; 5、使用close()关闭资源。 |
Client(客户端) | 1、建立客户端Socket连接,指定服务器的位置以及端口; 2、得到Socket的读写流; 3、利用流按照一定的协议对Socket进行读写操作; 4、使用close()关闭资源。 |
5、Socket通信原理详解
6、InetAddress类
如何在服务器端获取每个客户端的IP地址呢?
思路:
(1)InetAddress类:表示互联网协议地址,包含IP地址,是Java对IP地址的封装,它可以通过Socket的getAddress()方法获得。
(2)java.net.InetAddress类的常用方法:
常用方法 | 说明 |
getHostAddress() | 返回IP地址字符串(以文本表现形式); |
getHostName() | 获得此IP地址的主机名。 |
五、基于UDP协议的Socket编程
1、基于UDP协议的Socket(数据报式套接字)
基于UDP协议;无连接;透出数据包快递高速;数据安全性不佳。
比如:网络游戏,视频会话,QQ聊天信息
2、类
DatagramSocket类:发送和接收数据包的套接字,不维护连接状态,不产生输入输出流;
DatagramPacket类:数据包,封装了数据、数据长度、目标地址和目标端口。
注意:客户端要向外发送数据,必须首先创建一个DatagramPacket的对象,再使用DatagramSocket对象发送。
3、DatagramPacket类:
构造方法 | 说明 |
DatagramPacket(byte[]buf,int length,InetAddress address,int port) | 构造DatagramPacket对象,用来将长度为length的包发送到指定主机上的指定端口号。 |
DatagramPacket(byte[]buf,int length) | 构造DatagramPacket,用来接收长度为length的数据包。 |
DatagramPacket(byte[]buf,int length,SocketAddress sa) | 构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。 |
4、DatagramSocket类
构造方法 | 说明 |
DatagramSocket() | 创建一个DatagramSocket对象,并将其与本地主机上任何可用的端口绑定。 |
DatagramSocket(int port) | 创建一个DatagramSocket对象,并将其与本地主机上的指定端口绑定。 |
常用方法 | 说明 |
void send(DatagramPacket p) | 发送指定的数据报 |
void receive(DatagramPacket p) | 接收数据报,手打数据以后,存放在指定的DatagramPacket对象中 |
void close() | 关闭当前DatagramSocket对象 |
5、例子——在线客服系统客户咨询
用DatagramSocket来传输数据,而传输的数据是以数据报包(DatagramPacket)的形式存在的,基本的编程过程为:
Server(服务器) | Client(客户端) |
1、创建接收方(服务器端)的套接字,也就是DatagramSocket对象; 2、创建接收类型的数据报包(其中数据报包中的数据是以字节数组的形式存在的); 3、通过套接字(DatagramSocket)来接收数据报包(也就是客户端的请求信息); 4、响应客户端的请求,把数据(响应信息)包装在数据报包中; 5、发送响应给客户端(响应客户端的请求); 6、释放资源。 | 1、创建发送方(客户端)的套接字; 2、创建发送的请求(客户端的请求)数据的数据报包,包括请求的信息、服务器地址以及端口号; 3、发送请求给服务器; 4、接收服务器的响应信息的数据报包; 5、通过套接字接收服务器的响应; 6、释放资源。 |