目录
一、Socket 套接字
1、Socket 套接字的概念
Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基 于Socket套接字的网络程序开发就是网络编程。
2、Socket 套接字分类
●流套接字:使用传输层TCP协议、
●数据报套接字:使用传输层UDP协议
●原始套接字 原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。
3、Java数据报套接字通信模型
对于UDP协议来说,具有无连接,面向数据报的特征,即每次都是没有建立连接,并且一次发送全部数 据报,一次接收全部的数据报。
java中使用UDP协议通信,主要基于 DatagramSocket 类来创建数据报套接字,并使用 DatagramPacket 作为发送或接收的UDP数据报。对于一次发送及接收UDP数据报的流程如下:
以上只是一次发送端的UDP数据报发送,及接收端的数据报接收,并没有返回的数据。也就是只有请 求,没有响应。对于一个服务端来说,重要的是提供多个客户端的请求处理及响应,流程如下:
4、Java流套接字通信模型
5、Socket编程注意事项
●客户端和服务端:开发时,经常是基于一个主机开启两个进程作为客户端和服务端,但真实的场 景,一般都是不同主机。
●注意目的IP和目的端口号,标识了一次数据传输时要发送数据的终点主机和进程
●Socket编程我们是使用流套接字和数据报套接字,基于传输层的TCP或UDP协议,但应用层协议, 也需要考虑,这块我们在后续来说明如何设计应用层协议。
●关于端口被占用的问题
二、UDP数据报套接字编程
1、DatagramSocket API
DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。
DatagramSocket 类简介 : 负责 UDP 数据的发送和接收 , 该类没有合并到 Socket API 中 , 因为在 Socket 协议中 , 必须要存在服务器端与客户端 , 在 UDP 中 , DatagramSocket 既是服务器又是客户端 , 其不需要监听端口 , 也不需要建立连接 。
注意:使用DatagramSocket(int port)可能会出现端口被占用的情况
一旦通信双方在逻辑意义上有了通信线路,双方的地位就平等了(谁都可以是发送方和接收方),注意在通信结束后调用close方法进行资源的回收
2、DatagramPacket API
DatagramPacket类就是通信过程中的数据抽象
DatagramPacket是UDP Socket发送和接收的数据报。
获取对方的ip和端口号,getData方法是给接收者使用可以拿到对方进程发送的应用层数据
3、InetSocketAddress API
构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创 建。
4、相关示例代码
三、TCP 流套接字编程
1、ServerSocket API
ServerSocket 是创建TCP服务端Socket的API。
2、Socket API
Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服务端 Socket。
不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。
服务器的Socket对象是在accept()中获取到的,所以只有客户端的Socket对象需要手动化实例,这个构造方法就是提供给客户端使用的,传入服务器的ip+port就可以。
输入流就是给接收方使用的,输出流就是给发送方使用的
■关于输入流的使用:
● 如果直接进行二进制读取
byte[] buf=new byte[1024]; int n=inputStream.read(buf);
● 如果进行读取文本数据,建议直接使用Scanner封装InputStream后在使用
Scanner sc=new Scanner(inputStream,"UTF-8");
s.nextLine()...
■关于输出流的使用
●如果直接进行二进制的输出
outputStream.write(buf,offset,length);
●如果进行的是文本输出,建议OutputStream封装成OutStreamWriter再封装成PrintWriter
OutputStreamWriter osWriter=new OutputStreamWriter(outputStream,"UTF-8");
PrinterWriyer writer=new PrintWrirter(osWriter);
writer.println(...);/writer.print(...);/writer.printf(format,...);
●最后记得刷新缓存区(flush)。
3、TCP中的长短连接
TCP发送数据时,需要先建立连接,什么时候关闭连接就决定是短连接还是长连接:
●短连接:每次接收到数据并返回响应后,都关闭连接,即是短连接。也就是说,短连接只能一次收发数 据。
●长连接:不关闭连接,一直保持连接状态,双方不停的收发数据,即是长连接。也就是说,长连接可以 多次收发数据。
对比以上长短连接,两者区别如下:
●建立连接、关闭连接的耗时:短连接每次请求、响应都需要建立连接,关闭连接;而长连接●只需要 第一次建立连接,之后的请求、响应都可以直接传输。相对来说建立连接,关闭连接也是要耗时 的,长连接效率更高。
●主动发送请求不同:短连接一般是客户端主动向服务端发送请求;而长连接可以是客户端主动发送 请求,也可以是服务端主动发。
●两者的使用场景有不同:短连接适用于客户端请求频率不高的场景,如浏览网页等。长连接适用于 客户端与服务端通信频繁的场景,如聊天室,实时游戏等。
4、相关代码示例
四、TCP协议简介
1、TCP的概念
TCP:传输控制协议
TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的 控制。
2、TCP的可靠性
●TCP会尽自己所能,尽量发送数据给对方,但并不能保证100%发送给对方。
●TCP会在数据不能发送给对方的情况给应用层一个错误通知。
●TCP可以保障接收方严格按照发送时的数据顺序接收。
●TCP保障数据不会出现无意间的损坏(UDP也可以做到)。
●TCP尽可能在维护网络质量。