zoukankan      html  css  js  c++  java
  • UDP协议

    UDP协议

    1.UDP使用场景

    1. 域名系统

      若是执行时间内,没有响应返回,证明包已丢失。

    2. 音频或视频

      数据包的丢失只会造成通话或视频的干扰和不清楚,而不会像TCP协议那样造成通话的丢失或卡顿。

    2.UDP和TCP的类比

    UDP类似于邮局,数据的接受与否和到达顺序,邮局是不可控的。但是可以通过数据报的数据,预先协商好协议,达到对数据顺序和数据完整性的控制。

    TCP类似于电话,通话的应答和响应是可控的。

    3.UDP的传输形式和TCP的对比

    UDP是以数据包的形式,而TCP中是通过流的形式传输。

    UDP客户端

    1.创建客户端的步骤

    1、首先打开一个Socket连接

    //客户端使用随机端口
    DatagramSocket socket = new DatagramSocket(0);
    

    2、设置一个连接超时时间

    //UDP是无连接的网络协议,不设置超时时间,即使远程主机未在端口监听,你也永远接收不到回音
    socket.setTimeOut(10000);
    

    3、建立数据包,一个发送数据包,一个接收数据包

    //发送数据包
    InetAddress host = InetAddress.getByName("www.baiud.com");
    DatagramPacket request = new DatagramPacket(new byte[1],1,host,9999);
    
    //接收数据包
    Byte byte = new Byte[1024];
    DatagramPacket response =  DatagramPacket(byte,byte.length);
    
    socket.send(request);
    socket.receive(response);
    
    //注 java7中,DatagramSocket实现了AutoCloseablem,所以声明socket时,可以使用 try-with-resources
    try(DatagramSocket socket = new DatagramSocket(0)){
        //连接到服务器
    }catch(IOException ex){
        Sysstem.err.println("Could not connect to ......")
    }
    

    2.示例

    UDP服务器

    1.与TCP的不同

    模式与客户端相同,不过在发送之前要先接收,而且不会选择要绑定的匿名接口。与TCP不同,并没有单独的DatagramServerSocket类

    2.创建注意事项

    1、创建一个接收数据的请求包

    DatagramPacket request = new DatagramPacket(new byte[1024],0,1024);
    //这个调用会无限阻塞
    scoket.receive(request);
    

    2、创建一个响应包

    //响应包的声明规范对于服务器属性是关联的,此处的响应包需要指明响应的地址和端口
    DatagramPacket response = new DatagramPacket(new byte[1],1,host,9999);
    

    3.示例

    DatagramPacket类

    1、组成

    UDP数据包是基于IP数据报建立的,只向其底层IP数据报添加了很少的一点内容。

    向IP数据报首部添加了8字节。

    UDP首部包括源和目标端口号、IP首部之后所有内容的长度,以及一个可选的校验和。

    端口号以2字节无符号整数给出,主机有65536个不同的UDP端口号可以使用,与每台主机的65536个不同的TCP端口截然不同。

    因此,数据包中的字节数不能超过65536减去首部的8个字节。

    校验和字段是可选的,应用层程序不适用这个校验和,如果数据的校验和失败,那么底层网络软件会丢弃这个数据报,发送方和接收方都不会收到通知。毕竟,UDP是不可靠的协议。

    816350-20151024000208442-1929974276

    2、UDP数据报长度

    1、理论最大值

    65507字节

    2、实际限制

    8192字节 8KB

    3、为保证最大的安全性

    512字节或更少

    注意 TCP

    TCP数据报也存在这个问题,但Socket和ServerScoket提供的是基于流的API,因此对程序员隐藏了这些细节。

    3、DatagramPacket 类

    只提供了获取和设置IP首部中源或目标地址、获取和设置源或目标端口、获取和设置数据、以及获取和设置数据长度。其余首部字段无法通过java代码访问。

    1、构造函数

    1、接收数据报的构造函数

    2、发送数据报的构造函数

    2、get方法

    3、set方法

    DatagramSocket 类

    1、构造函数

    2、发送和接收数据报

  • 相关阅读:
    从 java 代码到 android 进程的详细过程
    c++ 智能指针
    linux 进程间共享内存示例
    visual studio 在windows远程调试 linux 程序 cout 输出乱码
    wcf restful 访问报错 *.svc HTTP error 404.17
    c++ 创建 uuid guid
    c++ 事件回调 java
    java通过jna调用so
    java执行jar包
    java调用com组件com4j
  • 原文地址:https://www.cnblogs.com/nangonghui/p/12020082.html
Copyright © 2011-2022 走看看