最近真的比较忙,很久就想写了,可是一直苦于写点什么,今天脑袋灵光一闪,觉得自己再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次方个端口。也就是可以接收的数据可以有这么多。当然,目前一台机器能处理的数据没有这么多。

  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;    }}

  3)接下来是客户端的代码,步骤如下:

   a) 创建scanner用于在控制台进行数据输入,然后创建一个DatagramSocket用于处理数据。

    b) 创建一个DatagramPacket用于数据的发送。

    c) 进行数据发送。

    d) 持续发送数据,当收到bye字符串的话就会结束。

package myflink.udp;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.util.Scanner;/** * @author huangqingshi * @Date 2020-05-24 */public class UDPClient {    public static void main(String[] args) throws IOException {        Scanner scanner = new Scanner(System.in);        InetAddress ip = InetAddress.getLocalHost();        //1. 创建一个socket对象用于处理数据        DatagramSocket socket = new DatagramSocket();        //用于存放数据        byte[] buf = null;        //一个死循环,用于接收数据后处理,收到bye后结束处理        while(true) {            String input = scanner.nextLine();            //将接收到的信息转换为byte数组            buf = input.getBytes();            //2. 创建一个DatagramPack包用于创建发送的数据            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, ip, 8888);            //3. 发送数据            socket.send(datagramPacket);            //4. 如果收到了byte直接结束循环            if("bye".equals(input)) {                break;            }        }    }}

启动服务端和客户端,然后再控制台输入一些测试数据,看一下服务端的控制台输出:

客户端输入数据    Hello UDP服务端的输出数据    Client:-Hello UDP

  好了Demo已经执行完了,非常简单。

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

  1. TCP是可靠的传输,而UDP是非可靠数据传输。因为可靠,所以需要更高的延迟和网络带宽。而UDP则不需要,所以比较适合语音、视频电话等。

  2. UDP的Header字节为8个字节,非常少,而TCP需要至少20个字节。

  3. TCP是全双工的,即可以发送接收数据,可以想象两个人打电话,即可以听到声音又可以发送声音。而UDP发送数据的时候才连接,发送完数据之后不会保留连接。

  4. TCP是点对点连接的,而UDP是多对多进行数据传输。TCP以字节流形式发送,有拥塞控制,方式发送数据量太大拥塞。而UDP是以报文形式发送给目标机器,没有拥塞控制。

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

  1)三次握手建立连接处理:

  1. 首先创建连接时client需要发送一个SYN+随机sequence给 server 端,这是客户端的状态是SYN_SENT状态。

  2. server收到数据后会回复一个SYN+ACK,ACK为接收到的sequence+1,同时再发送一个sequence。server的状态为ACK_REVD。

  3. client再把收到的sequnce+1作为ACK再给到服务端,然后服务端和客户端的状态都是ESTABLISHED。说明连接建立了。

第二步中的SYN和ACK可以同时发送,这两个值同时发送不受影响,都可以建立连接。当然如果两步分开发送也是可以的,但是由于可以节省一步发送,所以不用多费事。

2)四次握手关闭连接处理:

  1. client发一个FIN和一个随机的sequence给server,然后客户端的状态变为FIN_WAIT_1状态。

  2. server收到了FIN后,状态变为CLOSE_WAIT,然后再把接收到的sequence+1和ACK标志返回给client。client收到ACK后变为FIN_WAIT2状态。

  3. 然后server再次给client发送一个FIN+sequence给client,此时客户端的状态变为TIME_WAIT状态。

  4. client再把收到的sequence + 1发送给server, 此时server的状态变为CLOSED。此时连接正式断开。

  这是客户端主动发起关闭连接的过程,还有同时发送FIN标志的情况。

  1. client发送FIN+sequence给server端,状态变为FIN_WAIT_1。

  2. server也发送FIN+sequence给client端,此时server的状态变为FIN_WAIT_1。client的接收FIN后变为CLOSING,同时server也变为CLOSING。

  3. client发送ACK+接收到的sequence+1给server。client的状态变为TIME_WAIT。

  4. server同时也发送ACK+接收到的seqnce+1给client。此时client和server都变为CLOSED。

整个过程是这么一个过程,那么为什么TCP连接的时候需要三次,而关闭的时候需要四次?

  因为建立连接的时候SYN+ACK可以同时发送,不影响连接建立。而关闭的时候FIN+ACK不能合起来,因为TCP是双向且全双工连接。也就是client和server建立好连接后,client和server即能发送信息同时也能接收信息。当client发送FIN给server的时候,只能说明客户端不给server发送数据了,但是不证明client不接收数据,所以给到server后,server处理好之后说我也不给你发数据了(FIN)。然后我已经你不给我发数据了(ACK),这个时候client收到后说知道了(ACK), 此时连接就关闭了。

好了,关于这篇就整理到这里,如果有不对的地方欢迎批评指正。

接收udp数据_聊聊UDP、TCP和实现一个简单的JAVA UDP小Demo相关推荐

  1. 自己的java框架_手把手教你如何设计一个简单的Java框架

    您可能对框架如何工作感到好奇?这里将通过一个简单的框架示例来说明框架的思想. 框架目标 首先,为什么我们需要一个除普通库以外的框架?框架的目标是定义一个过程,使开发人员可以根据个人需求实现某些功能.换 ...

  2. java 序列化 例子_一个简单的Java序列化的例子

    简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对 ...

  3. 使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络

    使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络 本文例程部分主要参考官方文档. JAX简介 JAX 的前身是 Autograd ,也就是说 JAX 是 Autograd 升级版本 ...

  4. java爬虫黑马百度云,Java爬虫小Demo java爬取百度风云榜数据

    Java爬虫小Demo java爬取百度风云榜数据 很简单的一个小例子,使用到了java的爬虫框架 jsoup ,一起啦看看实现的方法吧! 相关推荐:Python爬虫实战 python爬虫爬取百度风云 ...

  5. 接收二进制数据_详解前端websocket原理之数据传输协议

    前言 上一篇文章我们初步搭建了一个websocket服务器,但是还不能发送和接收数据,这篇文章我们聊一聊它是如何收发数据的.websocket支持文本和二进制的传输,内部是如何接收和发送数据的对使用者 ...

  6. controller接收json数据_答疑 | 前后端分离,如何接收json数据?

    1.颜老师,在前后端分离的项目中,后端如何接收前端发来的json数据?我记得是@RequestBody,但有时候会报错. 答:当使用SpringMVC接收json数据时,需要区分json的数据格式,具 ...

  7. simulink接收串口数据_基于Unity串口通信的解决方案

    思路有三种,等下我会详细介绍. 后面的博客详细介绍是我收录两年前写的博客,现在我已经没有往串口方向进行开发了,所以只能将一些思路分享给大家. ​ ​ 解决方式一:将Unity串口通信数据模块(接收与发 ...

  8. python神经网络训练数据_用Python从头开始实现一个神经网络

    注:本篇文章非原创,翻译自Implementing a Neural Network from Scratch in Python – An Introduction​www.wildml.com ...

  9. clistctrl控件最后插入在后面_用图表控件做一个简单的员工信息查询系统

    前几天在上课的时候有同学说在做人员的信息查询的时候,经常的要去做查找搜索很麻烦,能不能做一个简单的人员信息查询系统,只需要选择人员的编号就可以查询到这个员工的信息.其实要实现这个同学的需求在EXCEL ...

最新文章

  1. linux定时任务的设置
  2. zabbix 监控 redis
  3. CAN总线基础(二)——CAN总线物理层介绍(总线电压详解)
  4. Date和TimeZone的关系
  5. 【玩聚】OneJoo中国的第一个memeTracker?
  6. 即时通讯学习笔记004---即时通讯服务器种类认知
  7. 关于Cocos2d-x的动作和动画
  8. 秒杀系统优化方案之缓存、队列、锁设计思路
  9. 多光谱、高光谱与雷达数据等产品级划分标准
  10. 应广单片机 c语言,应广单片机 MINI-C编程指南.pdf
  11. PDF办公技巧之PDF怎么删除其中一页
  12. HTTP常见返回码(如:301,400,503)
  13. elementUI表格无数据显示图片
  14. 解决公司无法访问自建的网站问题
  15. List 过滤、排序、校验等处理方法
  16. Hive面试题系列第三题-用户留存问题
  17. 贝叶斯决策理论之入门篇
  18. 2020计算机网络管理员,2020计算机软考网络管理员模拟选择题及答案.pdf
  19. 外盘国际期货招商:从股票书挑出来的精华
  20. P文件(混合星历)中各卫星更新时间和卫星总数统计

热门文章

  1. vcsa清单配置和事件备份
  2. 稳坐视频云行业第一,阿里云将用边缘计算开辟新赛道
  3. 像数据科学家一样思考:12步指南(上)
  4. 我为什么要学习C++反汇编
  5. nopcommerce商城系统--源代码结构和架构
  6. 学习在网页中应用大图片背景的20个精美案例
  7. VS C# DateTimePicker()的小技巧
  8. python | 删除两个指定字符串之间的内容
  9. 语言余一个负数_C语言学习日记(8)——整数溢出
  10. codefirst 兼容oracle,EF6+MVC5之Oracleo数据库的CodeFirst方式实现