java UDP编程

  • UDP协议是一个不安全、不连续的,把数据发送出去之后就结束了,根本不管对方有没有接收到。

  • 快递员:DatagramSocket

  • 包裹:DatagramPacket

原理就是将数据以及对方的信息都放到包裹里面,然后让快递员发送给对应的人。

1、UDP传输数据

/*
DatagramSocket ds = new DatagramSocket(port); // 创建一个快递员,这个端口是自己开放的端口,用来接收和发送数据的。
别人给你发消息,就是给你这个端口发送数据。
然后你这个端口的快递员就可以拿到快递。
*/
public class UDPsendMsg {public void sendMsg(DatagramSocket ds, int port, String host, String msg){ // 发送信息byte[] bs = msg.getBytes(); // UDP传输只能传输字节流,所以需要将信息先转为byte数组DatagramPacket dp; // 创建一个包裹,用来存放需要发送的数据以及目标信息try {//  length是为了让对方知道你传输的数据长度dp = new DatagramPacket(bs, bs.length, InetAddress.getByName(host), port); // 将数据以及目标信息放进包裹ds.send(dp); // 通过快递员ds发送包裹} catch (UnknownHostException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}public String receMsg(DatagramSocket ds) { // 接收信息byte[] bs = new byte[1024]; // 用来存放接收的信息DatagramPacket dp = new DatagramPacket(bs, 1024); // 先创建一个新包裹try {ds.receive(dp); // 接收快递员ds的快递,放到dp包裹里} catch (IOException e) {throw new RuntimeException(e);}String msg = new String(bs, 0, dp.getLength()); // 数据在bs内,然后0,length是需要的数据信息,然后转为字符串return msg; }
}

2、练习

  • 实现一个多人聊天室内,跟之前的TCP多人聊天室功能相同

  • DatagramPacket包裹类通过快递员类得到包裹之后包裹类是有对方的host 、port等信息的。

public class UDPsendMsg { // 首先创建了一个工具类,用来发送和接收消息方法的封装调用public void sendMsg(DatagramSocket ds, int port, String host, String msg){byte[] bs = msg.getBytes();DatagramPacket dp;try {dp = new DatagramPacket(bs, bs.length, InetAddress.getByName(host), port);// 3.把包裹发送出去ds.send(dp);} catch (UnknownHostException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}public Map<String, String> receMsg(DatagramSocket ds) {byte[] bs = new byte[1024];DatagramPacket dp = new DatagramPacket(bs, 1024);try {ds.receive(dp);} catch (IOException e) {throw new RuntimeException(e);}String msg = new String(bs, 0, dp.getLength());Map<String, String> data = new HashMap<String, String>();data.put("msg", msg);data.put("port", String.valueOf(dp.getPort()));data.put("ip", dp.getAddress().toString().substring(1));return data;}
}
​
public class ReceThread extends Thread { // 实现客户端接收信息的线程private DatagramSocket ds;
​public ReceThread(DatagramSocket ds) {this.ds = ds;}
​@Overridepublic void run() {UDPsendMsg sendMsg = new UDPsendMsg();while(true) {Map<String, String> data = sendMsg.receMsg(ds);String str = (String)data.get("msg");System.out.println(str);}}
}
​
public class SendThread extends Thread { // 实现客户端发送信息的线程private DatagramSocket ds;public SendThread(DatagramSocket ds) {this.ds = ds;}@Overridepublic void run() {Scanner sc = new Scanner(System.in);UDPsendMsg sendMsg = new UDPsendMsg();System.out.println("可以进行聊天了!!");sendMsg.sendMsg(ds, 9999, "127.0.0.1", "asdf");while(true) {String str = sc.nextLine();sendMsg.sendMsg(ds, 9999, "127.0.0.1", str);}}
}
​
public class Client { // 实现客户端public static void main(String[] args) throws SocketException {Scanner sc  = new Scanner(System.in);System.out.println("请输入你使用的端口号:");int port = Integer.parseInt(sc.nextLine());DatagramSocket ds = new DatagramSocket(port);new ReceThread(ds).start();new SendThread(ds).start();}
}
​
public class ServerSendThread extends Thread { // 实现服务端的接收消息后发送给其它消息的线程private DatagramSocket ds;private List<Map<String, String>> datalist;public ServerSendThread(DatagramSocket ds, List<Map<String,String>> datalist) {this.ds = ds;this.datalist = datalist;}@Overridepublic void run() {UDPsendMsg sendMsg = new UDPsendMsg();
​while(true){Map<String, String> data = sendMsg.receMsg(ds);String msg = data.get("msg");Map<String, String> d = new HashMap<String, String>();d.put("port", data.get("port"));d.put("host", data.get("ip"));msg = data.get("ip") + "/" + data.get("port") + ": " + msg;if(!datalist.contains(d)) {// 聊天室内加入一个新成员System.out.println("聊天室内加入一个新成员" + d.get("host") + ":"+ d.get("port"));datalist.add(d);msg = "聊天室内加入一个新成员:" + data.get("ip") + "/" + data.get("port");}for(Map<String, String> da : datalist){if(!d.equals(da)) {sendMsg.sendMsg(ds, Integer.parseInt(da.get("port")), da.get("host"), msg);}}}}
}
​
public class Server { // 实现服务器端public static void main(String[] args) throws SocketException {DatagramSocket ds = new DatagramSocket(9999);List<Map<String, String>> list = new ArrayList<Map<String, String>>();new ServerSendThread(ds, list).start();}
}

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

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

相关文章

(八)STM32 USART —— 串口通讯

目录 1. 串口通讯协议简介 1.1 物理层 1.1.1 电平标准 1&#xff09;TTL 电平 2&#xff09;RS-232 电平 3&#xff09;RS-485 电平 4&#xff09;CAN 总线电平 1.1.2 USB 和 串口 的区分 1.1.3 RS-232 信号线 1.2 协议层 1&#xff09;波特率 2&#xff09;通讯…

负载均衡:一致性哈希解决了哪些问题?

在业务开发中&#xff0c;缓存服务和其他数据服务一样&#xff0c;需要满足高可用性&#xff0c;而高可用最常用的手段就是集群扩展。 缓存的集群高可用 目前 Redis 流行的集群方案有 官方 Cluster 方案、twemproxy 代理方案、哨兵模式、Codis 等方案&#xff0c;关于这几种方…

Java 自定义泛型

1、接口的泛型 例如List<数据类型>&#xff0c;在创建接口的时候可以通过传不同的类型&#xff0c;进行使用。 如果需要对一些类型进行一些相同的类似于增删改查的操作&#xff0c;那么可以用泛型来简化&#xff0c;只需要将需要操作的类型传入即可。 需要注意的是泛型…

阿里云赵大川:弹性计算推理解决方案拯救 AIGC 算力危机

云布道师 本篇文章围绕弹性计算推理解决方案 DeepGPU 实例如何支持 Stable Diffusion 文生图推理、Stable Diffusion 推理演示示例等相关话题展开。 赵大川 阿里云弹性计算高级技术专家 GPU 云服务器推理解决方案的提出背景 随着 AIGC 时代的到来&#xff0c;两个重要应用应…

js如何调用iframe页面里的方法

document.getElementById("iframeID").contentWindow.子级页面方法(); <body><h3>父页面</h3><iframe id"iframebb" src"b.html" ></iframe><br><script>function ff(){alert("这里是父页面ff的…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -SpringMVC @RequestMapping详解

第一章 RequestMapping详解 RequestMapping注解作用&#xff1a;为指定的类或方法设置相应URL 1.1 RequestMapping注解位置 书写在类上面 作用&#xff1a;为当前类设置映射URL注意&#xff1a;不能单独使用&#xff0c;需要与方法上的RequestMapping配合使用 书写在方法上面 …

vi和vim的区别

目录 一、前言 二、vi/vim 的介绍 三、Vi/Vim 常见指令 四、vi和vim的区别 一、前言 写这篇文章的目的&#xff0c;是为了告诉大家我们如果要在终端下对文本进行编辑和修改可以使用vim编辑器。 Ubuntu 自带了 VI 编辑器&#xff0c;但是 VI 编辑器对于习惯了 Windows 下进…

Python办公自动化 – 日志分析和自动化FTP操作

Python办公自动化 – 日志分析和自动化FTP操作 以下是往期的文章目录&#xff0c;需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自动化 – 对…

55 回溯算法解黄金矿工问题

问题描述&#xff1a;你要开发一座金矿&#xff0c;地质学家已经探明了这座金矿中的资源分布&#xff0c;并用大小为m*n的网格grid进行了标注&#xff0c;每个单元格中的整数就表示这一单元格中的黄金数量&#xff1b;如果单元格是空的&#xff0c;那么就是0&#xff0c;为了使…

【pentaho】kettle读取Hive表不支持bigint和timstamp类型解决。

一、bigint类型 报错: Unable to get value BigNumber(16) from database resultset显示kettle认为此应该是decimal类型(kettle中是TYPE_BIGNUMBER或称BigNumber)&#xff0c;但实际hive数据库中是big类型。 修改kettle源码解决&#xff1a; kettle中java.sql.Types到kettle…

MFC使用高速绘图控件high-speed Charting Control绘制柱形图

1. 创建MFC单文档工程BarChartDemo。 2. 在工程文件夹下新建文件夹ChartCtrl,将ChartCtrl源码放入,如下图所示。在工程中添加这些项,项目——添加——现有项,全部添加。 3. 添加一个对话框,ID为IDD_DLG_BAR,类名为CBarDlg。 4. 在对话框中添加Custom Control控件,将控…

【SpringBoot应用篇】【AOP+注解】SpringBoot+SpEL表达式基于注解实现权限控制

【SpringBoot应用篇】【AOP注解】SpringBootSpEL表达式基于注解实现权限控制 Spring SpEL基本表达式类相关表达式表达式模板 SpEL表达式实现权限控制PreAuthAuthFunPreAuthAspectUserControllerSpelParserUtils Spring SpEL Spring 表达式语言 SpEL 是一种非常强大的表达式语言…

cka从入门到放弃

无数次想放弃&#xff0c;最后选择了坚持 监控pod日志 监控名为 foobar 的 Pod 的日志&#xff0c;并过滤出具有 unable-access-website 信息的行&#xff0c;然后将 写入到 /opt/KUTR00101/foobar # 解析 监控pod的日志&#xff0c;使用kubectl logs pod-name kubectl logs…

OSPF面试总结

OSPF 基本特点 属于IGP、LS支持无类域间路由没有环路&#xff08;区域内运行LS、区域间是DV,所以所有的区域要和区域0相连&#xff09;收敛速度快使用组播发送数据 224.0.0.5、224.0.0.6 什么时候用224.0.0.5&#xff1f;支持多条等价路由支持协议报文认证 OSPF路由的计算过程…

Pytorch:torch.nn.utils.clip_grad_norm_梯度截断_解读

torch.nn.utils.clip_grad_norm_函数主要作用&#xff1a; 神经网络深度逐渐增加&#xff0c;网络参数量增多的时候&#xff0c;容易引起梯度消失和梯度爆炸。对于梯度爆炸问题&#xff0c;解决方法之一便是进行梯度剪裁torch.nn.utils.clip_grad_norm_&#xff08;&#xff09…

CMD中文名称修改

会引发的问题 1. jupyter notebook运行出现Bad file descriptor (bundled\zeromq\src\epoll.cpp:100) 2. 用Anaconda或pycharm运行jupyter notebook时候&#xff0c;创建ipynb文件没一会儿就开始报错,且没法运行代码 3. 使用opencv时报错&#xff0c;opencv不支持中文路径&…

Python 爬虫之下载视频(二)

爬取某Y的视频链接和标题 文章目录 爬取某Y的视频链接和标题前言一、基本思路二、程序解析阶段三、程序处理阶段总结 前言 这篇内容就简单给大家写个如何从网页上爬取某B主 主页 页面上所有的视频链接和视频标题。 这篇是基础好好看&#xff0c;下篇会根据这篇的结果做一个批…

如何开发专属花店展示平台小程序?

如今&#xff0c;微信小程序已经成为了花店行业拓展客户资源的重要工具。通过开发一个专属花店小程序&#xff0c;你可以为自己的花店带来更多的曝光和客户资源。那么&#xff0c;如何开发一个专属花店小程序呢&#xff1f;接下来&#xff0c;我们将一步步为你详细讲解。 首先&…

产能过剩的今天,企业的方向在哪里?

随着经济的发展和技术的进步&#xff0c;许多行业都面临着产能过剩的问题。在产能过剩的背景下&#xff0c;企业如何找到新的发展方向&#xff0c;成为了一个亟待解决的问题。本文将探讨产能过剩时代下&#xff0c;企业应该如何寻找新的发展之路。 接下来我们就来看看当今的产…

共建还是对抗?BTC 铭文风波中开发者、矿工与社区的平衡艺术

近期&#xff0c;比特币铭文正加速进入一场争议与危机的漩涡。12 月 6 日&#xff0c;比特币核心开发人员 Luke Dashjr 在 X 表示&#xff0c;铭文&#xff08;Inscriptions&#xff09;正在利用比特币核心客户端 Bitcoin Core 的一个漏洞向区块链发送垃圾信息&#xff0c;Bitc…