7.3(java学习笔记)网络编程之UDP
一、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相关推荐
- udp java 编程_JAVA 网络编程之UDP编程
多线程,网络编程,反射,集合是java语言的重头戏,其中反射是java一切框架的基石. 客户端: SocketAddress sa =new InetSocketAddress("10.1 ...
- 萌新解--Java网络编程之UDP
Java网络编程之UDP UDP协议为无连接的通信协议,在传数据前发送端与接收端不会先建立连接,也就是你发我就收但不一定会收到哦,以我们自身为发送端,我们不会事先让接收方知道我要给接收方发数据啦.就像 ...
- Python中的网络编程之UDP
Python中的网络编程之UDP 文章目录 Python中的网络编程之UDP 一.Socket编程 `1.什么是客户端/服务器架构`? **`2.套接字:通信端点`** 3.套接字地址:主机-端口对 ...
- java udp 同一个端口实现收发_Java网络编程之UDP协议
伙伴们注意了! 小编在这里给大家送上关注福利: 搜索微信公众号"速学Java"关注即可领取小编精心准备的资料一份! 今天我们来聊聊 网络编程这部分的内容 网络编程 1)计算机网络 ...
- java 学习笔记-网络编程(八)
网络编程 标签:学习各种网络协议的桥梁 什么是计算机网络 计算机网络的作用:资源共享和信息传递. 计算机网络的组成: a) 计算机硬件:计算机(大中小型服务器,台式机.笔记本等).外部设备(路由器.交 ...
- Java学习笔记-网络编程
Java提供了网络编程,并且在实际中有着大量运用 网络编程 网络编程概述 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 IP地址 ...
- Java网络编程之UDP和TCP套接字
文章目录 一. 网络编程概述 二. UDP网络编程 1. UDP套接字 2. UDP客户端回显服务器程序 2.1 UDP回显服务器 2.2 UDP客户端 2.3 UDP实现查词典的服务器 三. TCP ...
- Java网络编程之UDP与TCP的网络编程
⭐️前面的话⭐️ 本文将介绍java中的网络编程,常见的网络编程方式有两种,一种是UDP,另外一种是TCP,其中UDP的服务器与客户端之间不需要建立连接就能进行通信,而TCP需要先建立服务器与客户端之 ...
- 1.6 网络编程之 UDP通信
************************************************** * 本文由小鸟飞飞整理发表 <samboy@sohu.com> * * 首发网站:蓝丽 ...
最新文章
- 关于Iframe在IE6下不显示的bug
- eclipse 3.55安装j2ee开发工具
- C++知识点2——指针、引用基础
- Appium如何获取appPackage和appActivity
- [原]JS ajax类的三种封装形式及简单对比
- 学习笔记----周志华《机器学习》第五章(神经网络)(二)
- SVM(support vector machine)支持向量机原理详解
- 让Microsoft Web Application Stress Tool 支持非80端口的站点测试
- iis的web站点配置
- 2.3_circular_queue_环形队列
- RestTemplate远程接口调用
- 博通:NFC将成手机标配nbsp;新芯…
- iOS关于代理的理解
- 文档交接说明书(模板)
- 双线性插值公式推导及Matlab实现
- Excel 用 vba 批量插入/提取批注
- Java 基础实验 自由落体
- 三维数字沙盘电子沙盘MR AR VR虚拟现实无人机倾斜摄影三维全景建模卫星图片矢量
- SEO站内优化教程-SEO站内优化方法教程
- 陪着时光,走过羊肠阡陌
热门文章
- Linux下套接字详解(四)----简单的TCP套接字应用(迭代型)
- HTML5 —— 属性
- C++ STL算法系列4---unique , unique_copy函数
- 宽幅FLASH产品展示代码多图带左右显示按钮 - 图
- 学习C++就这么简单
- 全能型 uWSGI 配置
- wordpress rest api 漏洞又来了CVE-2017-5487 上次是修改文章内容这次可是泄露用户数据...
- oracle:case when then else end
- 构建高性能数据库缓存之redis主从复制
- iPhone Instruments工具使用_检测内存泄露(转)