JAVA深化篇_38—— UDP通信的实现和项目案例

UDP通信的实现和项目案例

UDP通信实现原理

UDP协议与之前讲到的TCP协议不同,是面向无连接的,双方不需要建立连接便可通信。UDP通信所发送的数据需要进行封包操作(使用DatagramPacket类),然后才能接收或发送(使用DatagramSocket类)。

DatagramPacket:数据容器(封包)的作用

此类表示数据报包。 数据报包用来实现封包的功能。

常用方法:

方法名使用说明
DatagramPacket(byte[] buf, int length)构造数据报包,用来接收长度为 length 的数据包
DatagramPacket(byte[] buf, int length, InetAddress address, int port)构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
getAddress()获取发送或接收方计算机的IP地址,此数据报将要发往该机器或者是从该机器接收到的
getData()获取发送或接收的数据
setData(byte[] buf)设置发送的数据

DatagramSocket:用于发送或接收数据报包

当服务器要向客户端发送数据时,需要在服务器端产生一个DatagramSocket对象,在客户端产生一个DatagramSocket对象。服务器端的DatagramSocket将DatagramPacket发送到网络上,然后被客户端的DatagramSocket接收。

DatagramSocket有两种常用的构造函数。一种是无需任何参数的,常用于客户端;另一种需要指定端口,常用于服务器端。如下所示:

  1. DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。
  2. DatagramSocket(int port) :创建数据报套接字并将其绑定到本地主机上的指定端口。

常用方法:

方法名使用说明
send(DatagramPacket p)从此套接字发送数据报包
receive(DatagramPacket p)从此套接字接收数据报包
close()关闭此数据报套接字

UDP通信编程基本步骤:

  1. 创建客户端的DatagramSocket,创建时,定义客户端的监听端口。
  2. 创建服务器端的DatagramSocket,创建时,定义服务器端的监听端口。
  3. 在服务器端定义DatagramPacket对象,封装待发送的数据包。
  4. 客户端将数据报包发送出去。
  5. 服务器端接收数据报包。

UDP通信入门案例

创建服务端

public class UDPServer {public static void main(String[] args) {//创建服务端接收数据的DatagramSocket对象try(DatagramSocket datagramSocket = new DatagramSocket(9999)){//创建数据缓存区byte[] b = new byte[1024];//创建数据报包对象DatagramPacket dp =new DatagramPacket(b,b.length);//等待接收客户端所发送的数据datagramSocket.receive(dp);String str = new String(dp.getData(),0,dp.getLength());System.out.println(str);}catch(Exception e){e.printStackTrace();}}
}

创建客户端

public class UDPClient {public static void main(String[] args) {//创建数据发送对象 DatagramSocket,需要指定消息的发送端口try(DatagramSocket ds = new DatagramSocket(8888)) {//消息需要进行类型转换,转换成字节数据类型。byte[] b = "打酱油".getBytes();//创建数据报包装对象DatagramPacketDatagramPacket dp = new DatagramPacket(b, b.length, new InetSocketAddress("127.0.0.1", 9999));//发送消息ds.send(dp);}catch(Exception e){e.printStackTrace();}}
}

UDP协议传递基本数据类型

创建服务端

public class BasicDataUDPServer {public static void main(String[] args) {try(DatagramSocket datagramSocket =new DatagramSocket(9999);){//创建字节数组缓冲区byte[] bytes = new byte[1024];//创建datagramPacket存放字节数组类型的数据DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length);//等待客户端传入数据datagramSocket.receive(datagramPacket);//实现数据类型转换try(DataInputStream dataInputStream =new DataInputStream(new ByteArrayInputStream(bytes))){//通过基本数据数据流对象获取传递的数据System.out.println(dataInputStream.readLong());}}catch (Exception e){e.printStackTrace();}}
}

创建客户端

public class BasicDataUDPClient {public static void main(String[] args) {//创建发送数据的DatagramSocket对象try(DatagramSocket datagramSocket = new DatagramSocket(8856);//创建将基本数据类型转换为字节数组的ByteArrayOutputStream对象ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();//创建将基本数据类型写入ByteArrayOutputStream中的数据输出流对象DataOutputStream dataOutputStream =new DataOutputStream(byteArrayOutputStream)){//要传递的数据long data=10000l;//写入ByteArrayOutputStream对象dataOutputStream.writeLong(data);//将基本数据类型转换为字节数组byte[] byteArray = byteArrayOutputStream.toByteArray();//将字节数组包装到 DatagramPacket中DatagramPacket datagramPacket=new DatagramPacket(byteArray,byteArray.length, new InetSocketAddress("127.0.0.1",9999));//发送数据datagramSocket.send(datagramPacket);}catch (Exception e){e.printStackTrace();}}
}

传递自定义对象类型

创建Person类

/*** 当该对象需要在网络上传输时,一定要实现Serializable接口*/
public class Person implements Serializable {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

创建服务端

public class Person {public static void main(String[] args) {try(DatagramSocket datagramSocket =new DatagramSocket(9999);){byte[] bytes =new byte[1024];DatagramPacket datagramPacket =new DatagramPacket(bytes,bytes.length);//接收数据datagramSocket.receive(datagramPacket);//数据类型转换try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(datagramPacket.getData()))){Person person = (Person)ois.readObject();System.out.println(person);}}catch (Exception e){e.printStackTrace();}}
}

创建客户端

public class ObjectTypeClient {public static void main(String[] args) {try(DatagramSocket datagramSocket =new DatagramSocket();ByteArrayOutputStream bos =new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)){//实例化Person对象Person person =new Person();person.setAge(18);person.setName("zhangsan");//写入ByteArrayOutputStream对象oos.writeObject(person);//将自定义数据类型转换为字节数组类型byte[] byteArray = bos.toByteArray();//将自定义数据类型包装到DatagramPacket中DatagramPacket datagramPacket=new DatagramPacket(byteArray,byteArray.length,new InetSocketAddress("127.0.0.1",9999));//发送数据datagramSocket.send(datagramPacket);}catch (Exception e){e.printStackTrace();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux安装并配置git连接github

git安装 sudo apt-get install git git信息配置 git config --global uer.name "yourname" git config --global user.email "youremail" 其中,yourname是你在github上配置的用户名,youremail是你在github上设置的邮箱 查看git…

Apinto 网关进阶教程,使用 API Mock 生成模拟数据

什么是 API Mock ? API Mock 是一种技术,它允许程序员在不依赖后端数据的情况下,模拟 web服务器端 API 的响应。通常使用 API Mock 来测试前端应用程序,而无需等待后端程序构建完成。API Mock 可以模拟任何 HTTP 请求方法&#x…

谷歌提出 AGI 完整路线图:目前 ChatGPT 只处于 AGI 的第一阶段

本心、输入输出、结果 文章目录 谷歌提出 AGI 完整路线图:目前 ChatGPT 只处于 AGI 的第一阶段前言谷歌 DeepMind 发布 AGI 分级框架发展 AGI 必须遵循6个基本原则什么是AGI图灵测试详解六大原则AGI 的五大发展过程阶段原文参考弘扬爱国精神谷歌提出 AGI 完整路线图:目前 Cha…

LeetCode(7)买卖股票的最佳时机【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 121. 买卖股票的最佳时机 1.题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票…

基于Python+Django的图书管理系统

项目介绍 图书是人类文明传播的一个重要方式,很多历史悠久的文明都是通过图书来进行传递的,虽然随着时代的进步电子信息技术发展很快,但是纸质图书的地位仍然是非常稳固的,为了能够让知识拥有更加快捷方便的传递方式我们开发了本…

CSS注入的四种实现方式

目录 CSS注入窃取标签属性数据 简单的一个实验: 解决hidden 方法1:jsnode.js实现 侧信道攻击 方法2:对比波兰研究院的方案 使用兄弟选择器 方法3:jswebsocket实现CSS注入 实验实现: 方法4:window…

centos7下安装主从仲裁三台结构的MongoDB 7.0.4

安装手册英文版在这里 https://www.mongodb.com/docs/v7.0/tutorial/install-mongodb-on-red-hat/ 我的安装过程 1)基础安装 1、创建 /etc/yum.repos.d/mongodb-org-7.0.repo文件 下面的代码复制到这个文件中,保存 [mongodb-org-7.0] nameMongoDB Re…

大模型+人形机器人,用AI唤起钢筋铁骨

《经济参考报》11月8日刊发文章《多方布局人形机器人赛道,智能应用前景广》。文章称,工信部日前印发的《人形机器人创新发展指导意见》,按照谋划三年、展望五年的时间安排,对人形机器人创新发展作了战略部署。 从开发基于人工智能大模型的人…

【CASS精品教程】cass3d 11.0加载超大影像、三维模型、点云数据

CAD2016+CASS11.0(内置3d)下载与安装: 【CASS精品教程】CAD2016+CASS11.0安装教程(附CASS11.0安装包下载)https://geostorm.blog.csdn.net/article/details/132392530 一、cass11.0 3d支持的数据 cass11.0中的3d模块增加了多种数据的支持,主要有: 1. 三维模型 点击…

CSS实现透明度效果的两种方法—— opacity 和 rgba()

在实际开发过程中&#xff0c;为了给用户呈现一些效果&#xff0c;我们需要控制元素的透明度。CSS 提供了 opacity 属性和 rgba() 函数给我们控制透明度&#xff0c;接下来通过一个例子来感受一下两种方法的区别。 <style>.transparentBox {display: inline-block;width…

AI驱动的软件测试,何时可以信赖?

综合编译&#xff5c;TesterHome社区 作者&#xff5c;Yuliya Vasilko&#xff0c;数据工程师 以下为作者观点&#xff1a; 越来越多的组织转向人工智能&#xff08;AI&#xff09;驱动的测试解决方案&#xff0c;以简化质量保证流程并提高软件可靠性。 随着对人工智能的依赖程…

功能案例 -- 拖拽上传文件,生成缩略图

直接看效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>拖拽上传文件</title>&l…

低价寄快递寄件微信小程序 实际商用版,对接了低价快递渠道,运营平台赚取差价,支持市面上全部主流快递

盈利模式 快递代下CPS就是用户通过线上的渠道&#xff08;快递小程序&#xff09;&#xff0c;线上下单寄快递来赚取差价&#xff0c;例如你的成本价是5元&#xff0c;你在后台比例设置里面设置 首重利润是1元&#xff0c;续重0.5元&#xff0c;用户下1kg的单页面显示的就是6元…

智慧商业:探索分布式云技术为企业创造商业价值,减少成本,提升生产力的秘诀!

我们可以试想一下&#xff0c;如果没有云计算&#xff0c;商业将会是什么样子&#xff1f; 对于这个问题的答案&#xff0c;许多人会认为它可能依旧是一个以实体为主行业。 云计算和多云战略的出现为在线购物带来了革命性的变化。 然而&#xff0c;如今多云所固有的复杂性仍然…

ElasticSearch知识点

什么是ElasticSearch ElasticSearch: 智能搜索&#xff0c;分布式的搜索引擎&#xff0c;是ELK的一个非常完善的产品&#xff0c;ELK代表的是: E就是ElasticSearch&#xff0c;L就是Logstach&#xff0c;K就是kibana Elasticsearch是一个建立在全文搜索引擎 Apache Lucene基础…

FreeRTOS源码阅读笔记2--list.c

list.c中主要完成列表数据结构的操作&#xff0c;有列表和列表项的初始化、列表的插入和移除。 2.1列表初始化vListInitialise() 2.1.1函数原型 void vListInitialise( List_t * const pxList ) pxList&#xff1a;列表指针&#xff0c;指向要初始化的列表。 2.1.2函数框架…

联系作者方式的教程

首先你应该目前是在付费资源运行效果的展示文章页面&#xff0c;如下所示 然后一直往下滑&#xff0c;滑到这个文章的最下面&#xff0c;就可以看到我的推广名片&#xff0c;最后点击这个名片就可以获取到我的联系方式了~

学习OpenCV(蝴蝶书/C++)相关——2.MacOS下使用LLDB调试cpp程序

文章目录 1. VScode中的调试2. 配置VSCode中C++的调试(以OpenCV为例)2.1 创建适用于C++的.launch文件2.2 常见参数说明2.3 调试OpenCV的.launch文件示例2.3.1 .launch文件demo2.3.2 Debug模式的可执行文件3. 联合task.json文件一起使用3.1 创建tasks.json和launch.json文件3.2 …

安装纯净版Linux后的必备设置

目录 一&#xff1a;网络设置 1&#xff0c;设置yum源 2&#xff0c;配置网络 二&#xff1a;samba服务设置 1&#xff0c;安装samba 2&#xff0c;设置samba 3&#xff0c;windows上挂载 三&#xff1a;安装必备的开发软件 1&#xff0c;GCC安装 2&#xff0c;Pyth…

JLink edu mini 10Pin接口定义

注意&#xff1a;SWD接口在阵脚2&#xff0c;4&#xff1b;而20Pin的SWD接口在阵脚7&#xff0c;9 参考&#xff1a;1 官网资料&#xff1b; 2 【润石RS0104YQ Demo开发板测试分享】J-Link EDU Mini调试5V系统_国产运算放大器_模拟开关_线性稳压器_电平转换器_小逻辑_比较器…