博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络协议——UDP协议
阅读量:5769 次
发布时间:2019-06-18

本文共 2895 字,大约阅读时间需要 9 分钟。

  1. udp简介:

    UDP是无连接通信协议,即在数据传输时,数据发送端和接收端不建立逻辑连接,简单来说,当一个计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在。就会发送数据;同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

特点:消耗资源小,通信效率高,常用于音频、视频和普通数据的传输,视频会议都是用UDP,因为在这种情况下丢失一两个数据包,也不会对接收结果产生太大影响,但是使用UDP传输数据时,由于其面向无连接性,不能保证数据的完整性,因此传输中药数据时不建议使用UDP协议。

  2.java提供的类

    DatagramPacket(集装箱):封装UDP通信中发送和接收的数据,使用时接收端可以只需要接收一个字节数组来存放收到的数据,也可以只接收指定IP和端口的数据,而发送端不但要存放发送数据的字节数组,还需要指定接收端IP地址和端口号。

      构造方法:

    (1)DatagramPacket(byte buf[], int length):只能用于接收端,参数为字节数组和数据大小;

    (2)DatagramPacket(byte buf[], int length, InetAddress address, int port):通常用于发送端,参数为字节数组,数据大小,接收地址和端口号

    (3)DatagramPacket(byte buf[], int offset, int length):用于接收端,参数多了一个offset,表示在将接收到的数据放入buff缓存数组时,从offset位开始放入

    (4)DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port):与(2)相似,主要在于参数新增offset, 表示在将接收到的数据放入buff缓存数组时,从offset位开始放入。

    获取数据的方法:

    (1)  InetAddress getAddress():返回InetAddress 对象,DatagramPacket中的接收地址;

    (2)  getPort():返回int型数据,DatagramPacket中的端口号;

    (3) getData():返回byte数组,内容为发送或接收数据;

    (4)  getLength():发送或接收数据长度,int型数据。

    DatagramSocket(码头):发送和接收DatagramPacket数据包,两者关系如下图:码头和集装箱:  

      

    构造方法:

    (1)DatagramSocket ():创建发送端DatagramSocket对象,在创建时没有指定端口号,所以系统会分配一个没有被其他网络程序所使用的端口号;

    (2)DatagramSocket (int port):创建接收端DatagramSocket对象或者发送端对象,在创建接收端对象时,port代表指定监听的端口;发送端代表发送端端口。

    (3)DatagramSocket (int port,InetAddress address):创建DatagramSocket对象指定端口号和相关IP地址,此情况适用于计算机上有多块网卡的情况,明确

      规定数据通过哪块网卡向外发送和接收哪块网卡的数据。正常情况下,不同网卡会分配不同IP,因此在创建DatagramSocket对象时需要通过指定IP地址来

      确定使用哪块网卡进行通信。

    其他方法

    (1)     void receive (DatagramPacket p):用于将接收到的数据填充到DatagramPacket数据包中,在接收到数据返回前会一直处于阻塞状态,只有当接收到数

       据包时,该方法才会返回。

    (2)     void send(DatagramPacket p):用于发送DatagramPacket数据;

    (3)     void close():关闭当前的Socket,释放资源。

     3.实现例子

    (1)接收端

public class Example02 {    public static void main(String[] args) throws Exception {        //创建一个长度为1024的字节数组,用于接收数据        byte[] buf  = new byte[1024];        //定义一个DatagramSocket对象,监听端口为8954        DatagramSocket ds = new DatagramSocket(8954);        //定义一个DatagramPacket对象,用于接收数据        DatagramPacket  dp= new DatagramPacket(buf, 1024);        System.out.println("等待接收数据");        ds.receive(dp); //等待接收数据,如果没有则会阻塞        //调用DatagramPacket的方法获得接收到的信息,包括数据内容、长度、发送的IP地址和端口号        String str= new String(dp.getData(), 0, dp.getLength())+"from "+dp.getAddress()+":"+dp.getPort();        System.out.println(str);        ds.close();            }}

 (2)发送端

public class Example03 {    public static void main(String[] args) throws Exception {        DatagramSocket ds = new DatagramSocket(3000);        String ss="hello world"; //要发送的数据        DatagramPacket dp = new DatagramPacket(ss.getBytes(),ss.length(),InetAddress.getByName("localhost"),8954);        System.out.println("发送信息");        ds.send(dp);        ds.close();    }}

 结果展示:

注意:如果希望在命令行运行成功,请保证java源码中没有头部package(包)信息!

转载于:https://www.cnblogs.com/tlxf-blog/p/10757622.html

你可能感兴趣的文章
Web应用程序安全与风险
查看>>
codeforces 984 A. Game
查看>>
CSS居中
查看>>
One Person Game(概率+数学)
查看>>
CodeForces 258B Little Elephant and Elections :于1-m中找出七个数,使六个数里面的4和7个数比第七个数严格小:数位dp+dfs...
查看>>
MAP
查看>>
手把手教你测——上网快鸟
查看>>
用javascript获取地址栏参数
查看>>
解析xml
查看>>
一起谈.NET技术,你应该知道的15个Silverlight诀窍
查看>>
SQL注入漏洞全接触--进阶篇
查看>>
电商应用脚本开发遇到问题和处理
查看>>
商教助手!解析夏普液晶高清宽屏投影机系列
查看>>
中国平安增持华夏幸福5.69%股权 看好长期战略协同
查看>>
云南去年有望实现151万贫困人口净脱贫
查看>>
Java架构师面试题系列整理(大全)
查看>>
延伸产业链 中国产粮大省向“精深”问发展
查看>>
消费贷用户70%月收入低于5000元 80、90后是主要人群
查看>>
2018年内蒙古外贸首次突破1000亿元
查看>>
为什么主流APP的推荐总能符合你口味?推荐系统了解一下
查看>>