一、UDP

  UDP的全称是User Datagram Protocol(用户数据报协议),是一种无连接的不安全的传输协议,

  传输数据时发送方和接收方无需建立连接,所以是不安全的。

  发送时不建立连接直接发送,发送后不关注接受方能否接到。UDP只负责发出去,后续的事情与之无关。

  1)、使用UDP发送和接受数据的过程:

  1接收数据:

    1.1创建数据包实例,用于接收数据。(指定接收方IP,端口)

    1.2创建接收容器

    1.3将接收容器封装成包

    1.4接收包

    1.5处理包(可以看做拆包,将包中数据拿出来)

    1.6释放资源

  2.发送数据

    2.1创建数据报实例,用于发送数据。(指定发送IP,端口)

    2.2创建发送资源

    2.3将发送资源封装成包(包加上发送目的地,端口)

    2.4发送包

    2.5释放资源

  2)、DatagramSocket & DatagramPacket

    java中将UDP封装成DatagramSocket类,用于发送和接收数据报。

    2.1构造方法:

    DatagramSocket(int port)//创建数据报,并绑定到本地主机的指定端口

    DatagramSocket(int port, InetAddress laddr)//创建数据报,绑定到指定地址的指定端口

    2.2主要方法

    void send(DatagramPacket p)//发送数据包
    void receive(DatagramPacket p)//接收数据包

  

    数据需要打包后才能发送,而接收数据也是以包的形式接收,java中使用DatagramPacket将数据打包。

    构造方法:

    DatagramPacket(byte[] buf, int length)//构造接收数据包及其长度,(设置接收数据包)

    DatagramPacket(byte[] buf, int length, InetAddress address, int port)//构造一个数据包,指定发送主机及端口信息(设置发送数据包)

    主要方法:

    int getLength()//返回要发送的或者要接受的数据长度

    byte[] getData()//获取发生或接受的数据,相当于拆包,获取包内数据。

Server:(接收数据) 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class Server {public static void main(String[] args) throws IOException {DatagramSocket server = new DatagramSocket(8888,InetAddress.getByName("localhost"));byte[] r = new byte[1024];//接收容器DatagramPacket packet = new DatagramPacket(r,r.length);//打包server.receive(packet);//接收包System.out.println(new String(packet.getData(),0,packet.getLength()));//拆包并解析包server.close();        }
}

Client:(发送数据)   

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;public class Client {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubDatagramSocket client = new DatagramSocket(8887,InetAddress.getByName("localhost"));String msg = "hello udp";byte[] b_msg = msg.getBytes();//数据-->字节     //打包,并加上目的地信息DatagramPacket packet = new DatagramPacket(b_msg,b_msg.length,InetAddress.getByName("localhost"),8888);client.send(packet);//发送包client.close();//释放资源}
}

运行结果:
hello udp

先运行Server,Server会等待数据,之后运行Client发送数据,Server接收到数据后就会解析。

想象成寄快递1.东西准备好(准备数据),

      2.转换为固定格式(数据转换为字节)

      3.然后打包,包上贴快递单(邮寄的目的地(IP)和接收人(端口))

      4.然后发送,

      5.接收方接收

      6.然后拆快递(拆包)

      7.然后拿到东西。(字节转换数据)

  

  

上面的数据是字符串可以直接转换为字节,但如果有时候传输的数据不能直接转换为字节这时该怎么办呢?

这就要用到IO流的知识,主要使用ByteArrayStream(toByteArray()方法)、DataStream(WriteXxxx()方法)。

数据-->字节:

先将数据及其格式通过DataOutputStream写入ByteArrayOutputStream中,再通过ByteArrayOutputStream中的toByteArray()方法将的字节拿出。

字节-->数据:

将字节数组放入ByteArrayInputStream中,然后通过DataInputStream中的readXxx读取ByteArrayInputStream中字节数组,将其转换为对应数据类型。

Server:

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Server {public static void main(String[] args) throws IOException {DatagramSocket server = new DatagramSocket(8888,InetAddress.getByName("localhost"));byte[] r = new byte[1024];DatagramPacket packet = new DatagramPacket(r,r.length);server.receive(packet);System.out.println(byteToDouble(packet.getData()));//字节转换为数组
        server.close();        }public static double byteToDouble(byte[] b) throws IOException{ByteArrayInputStream bis = new ByteArrayInputStream(b);//将字节放入ByteArratInputStream中DataInputStream dis = new DataInputStream(bis);//通过dis读取bis中字节double data = dis.readDouble();//通过dis.readXxxx读取bis中的字节数组。return data;}
}

Client:

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Client {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubDatagramSocket client = new DatagramSocket(8887,InetAddress.getByName("localhost"));//    String msg = "hello udp";Double data = 9.1;byte[] b_data = doubleToByte(data);//数据转换为字节DatagramPacket packet = new DatagramPacket(b_data,b_data.length,InetAddress.getByName("localhost"),8888);client.send(packet);client.close();}public static byte[] doubleToByte(double dou) throws IOException{ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建字节数组输入流DataOutputStream dos = new DataOutputStream(bos);//通过dos想bos中写入dos.writeDouble(dou);//通过dos中的write.Xxxx将dou写入bos中
        dos.flush();dos.close();byte[] data = bos.toByteArray();//将bos中字节取出。return data;}
}

运行结果:
9.1

转载于:https://www.cnblogs.com/huang-changfan/p/9926558.html

7.3(java学习笔记)网络编程之UDP相关推荐

  1. udp java 编程_JAVA 网络编程之UDP编程

    多线程,网络编程,反射,集合是java语言的重头戏,其中反射是java一切框架的基石. 客户端: SocketAddress sa =new  InetSocketAddress("10.1 ...

  2. 萌新解--Java网络编程之UDP

    Java网络编程之UDP UDP协议为无连接的通信协议,在传数据前发送端与接收端不会先建立连接,也就是你发我就收但不一定会收到哦,以我们自身为发送端,我们不会事先让接收方知道我要给接收方发数据啦.就像 ...

  3. Python中的网络编程之UDP

    Python中的网络编程之UDP 文章目录 Python中的网络编程之UDP 一.Socket编程 `1.什么是客户端/服务器架构`? **`2.套接字:通信端点`** 3.套接字地址:主机-端口对 ...

  4. java udp 同一个端口实现收发_Java网络编程之UDP协议

    伙伴们注意了! 小编在这里给大家送上关注福利: 搜索微信公众号"速学Java"关注即可领取小编精心准备的资料一份! 今天我们来聊聊 网络编程这部分的内容 网络编程 1)计算机网络 ...

  5. java 学习笔记-网络编程(八)

    网络编程 标签:学习各种网络协议的桥梁 什么是计算机网络 计算机网络的作用:资源共享和信息传递. 计算机网络的组成: a) 计算机硬件:计算机(大中小型服务器,台式机.笔记本等).外部设备(路由器.交 ...

  6. Java学习笔记-网络编程

    Java提供了网络编程,并且在实际中有着大量运用 网络编程 网络编程概述 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 IP地址 ...

  7. Java网络编程之UDP和TCP套接字

    文章目录 一. 网络编程概述 二. UDP网络编程 1. UDP套接字 2. UDP客户端回显服务器程序 2.1 UDP回显服务器 2.2 UDP客户端 2.3 UDP实现查词典的服务器 三. TCP ...

  8. Java网络编程之UDP与TCP的网络编程

    ⭐️前面的话⭐️ 本文将介绍java中的网络编程,常见的网络编程方式有两种,一种是UDP,另外一种是TCP,其中UDP的服务器与客户端之间不需要建立连接就能进行通信,而TCP需要先建立服务器与客户端之 ...

  9. 1.6 网络编程之 UDP通信

    ************************************************** * 本文由小鸟飞飞整理发表 <samboy@sohu.com> * * 首发网站:蓝丽 ...

最新文章

  1. 关于Iframe在IE6下不显示的bug
  2. eclipse 3.55安装j2ee开发工具
  3. C++知识点2——指针、引用基础
  4. Appium如何获取appPackage和appActivity
  5. [原]JS ajax类的三种封装形式及简单对比
  6. 学习笔记----周志华《机器学习》第五章(神经网络)(二)
  7. SVM(support vector machine)支持向量机原理详解
  8. 让Microsoft Web Application Stress Tool 支持非80端口的站点测试
  9. iis的web站点配置
  10. 2.3_circular_queue_环形队列
  11. RestTemplate远程接口调用
  12. 博通:NFC将成手机标配nbsp;新芯…
  13. iOS关于代理的理解
  14. 文档交接说明书(模板)
  15. 双线性插值公式推导及Matlab实现
  16. Excel 用 vba 批量插入/提取批注
  17. Java 基础实验 自由落体
  18. 三维数字沙盘电子沙盘MR AR VR虚拟现实无人机倾斜摄影三维全景建模卫星图片矢量
  19. SEO站内优化教程-SEO站内优化方法教程
  20. 陪着时光,走过羊肠阡陌

热门文章

  1. Linux下套接字详解(四)----简单的TCP套接字应用(迭代型)
  2. HTML5 —— 属性
  3. C++ STL算法系列4---unique , unique_copy函数
  4. 宽幅FLASH产品展示代码多图带左右显示按钮 - 图
  5. 学习C++就这么简单
  6. 全能型 uWSGI 配置
  7. wordpress rest api 漏洞又来了CVE-2017-5487 上次是修改文章内容这次可是泄露用户数据...
  8. oracle:case when then else end
  9. 构建高性能数据库缓存之redis主从复制
  10. iPhone Instruments工具使用_检测内存泄露(转)