聊聊UDP、TCP和实现一个简单的JAVA UDP小Demo

  最近真的比较忙,很久就想写了,可是一直苦于写点什么,今天脑袋灵光一闪,觉得自己再UDP方面还有些不了解的地方,所以要给自己扫盲。

  好了,咱们进入今天的主题,先列一下提纲:

  1. UDP是什么,UDP适用于什么场景?

  2. 写一个小Demo来加深一下UDP的理解。

  3. UDP和TCP的区别有哪些?

  4. TCP建连和关闭的过程,为什么建立连接的时候是三次握手,断开连接的时候需要四次?

  

  1. UDP是什么,UDP适用于什么场景?

  相信很多同学都听过UDP,UDP的全称:User Datagrame Protocol, 用户报文协议,是一个传输层协议。UDP最大的特点是:不可靠网络传输,无连接数据协议,即发送前不要连接,直接向目标地址发送。而TCP和UDP基本上是相互补充的,TCP是可靠的数据数据传输,基于连接后的数据发送。

  TCP是Transmission Control Protocol,传输控制协议,TCP是基于可靠的数据传输,那么就需要牺牲更多的延迟和网络带宽。而UDP则不需要可靠的数据传输,那么将会需要更小的网络延迟和网络开销。UDP可以允许丢弃延迟的数据包。由于低延迟低带宽,所以UDP非常适合电脑游戏,语音电话,视频电话,网络直播。

  我们接下来看一下UDP的Packet的组成(图片来源网络),8字节的Header,然后就是UDP的数据。本机如果作为客户端的话,本机的端口号为0-65535,也就是本机连接外部机器的话最多可以连接65536,0是保留端口号。如果作为服务端的话,可以使用的端口为2的32次方个端口。也就是可以接收的数据可以有这么多。当然,目前一台机器能处理的数据没有这么多。

聊聊UDP、TCP和实现一个简单的JAVA UDP小Demo

 

  8字节的Header,很简单也比较少,不像TCP需要20-60字节的数据。

  Source port,源端口号,16位2个字节。

  Length, 数据的长度2个字节。

  Distination port, 目标端口,用于识别到目标机器的端口号。2个字节。

  Checksum, 用于计算Header的Checksum(校验值)。

 

  2. 写一个小Demo来加深一下UDP的理解。

  1) UDP的服务端代码,因为UDP的代码都是JDK自带的,所以也不需要引入其他jar包就可以。

  2)Server端主要创建步骤:

    a) 创建一个监听udp的端口号 8888.

    b) 创建一个用于接收数据的DatagramPacket,参数有两个,一个是数据,一个是数据的长度。

    c) 采用循环进行receive数据,直到收到的bye字符串。

package myflink.udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * @author huangqingshi * @Date 2020-05-24 */ public class UDPServer { public static void main(String[] args) throws IOException { //1. 创建一个监听8888端口的udp socket DatagramSocket ds = new DatagramSocket(8888); //设置接收数据的最大值 byte[] receive = new byte[65535]; //用于接收的数据 DatagramPacket datagramPacket = null; while(true) { //2. 创建一个用于接收数据。buf即数据和其长度 datagramPacket = new DatagramPacket(receive,receive.length ); //3. 接收byteBuff的数据 ds.receive(datagramPacket); System.out.println("Client:-" + data(receive)); //4. 如果接收到了bye,程序结束 if("bye".equals(data(receive))) { break; } //5.清理receive中的数据 receive = new byte[65535]; } } public static StringBuilder data(byte[] bytes) { if(bytes == null) { return null; } StringBuilder ret = new StringBuilder(); int i = 0; while (bytes[i] != 0) { ret.append((char) bytes[i]); i++; } return ret; } }

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

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