基于UDP实现简易聊天

2023-11-11

概述

    UDP没有创建连接,数据包是一次收发一个,没有流的概念。但是在UDP编程中需要用到的是Socket,因为应用程序在使用UDP时必须指定网络接口(IP地址)和端口号。

服务器端

在服务器端,使用UDP也需要监听指定的端口。Java提供了DatagramSocket来实现这个功能。
代码实现如下:

DatagramSocket socket = new DatagramSocket(7788);//监听端口
			//提前创建两个Parket数据包,分别用于接收和发送
			DatagramPacket sendPacket = new DatagramPacket(new byte[1024],1024,
					new InetSocketAddress("192.168.254.173",9888));//目的地
			DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024);
			
			while(true) {
				//接收
				socket.receive(receivePacket);
				String receiveContent = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());
				System.out.println("它说:"+receiveContent);
				if(receiveContent.equals("over")) {
					System.out.println("对方已经退出聊天");
					return;
				}
				
				//发送
				System.out.println("你说:");
				String sendContent = input.nextLine();
				sendPacket.setData(sendContent.getBytes());
				socket.send(sendPacket);
				if(sendContent.equals("over")) {
					System.out.println("你已经退出聊天");
					return;
				}
			}

注意
如果没有其他应用程序占据这个端口,那么监听工程,我们就用一个无限循环来处理收到的UDP数据包(在最外层)。

对上面的代码解释
要接收一个UDP数据包,需要准备一个byte[] 缓冲区,并通过DatagramPacket实现接收:

byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
ds.receive(packet);
    当服务器收到一个DatagramPacket后,通常必须立刻恢复一个或多个UDP包,因为客户端在DatagramPacket中,每次收到的DatagramPacket可能是不同的客户端,如果不回复的话,客户端就收不到任何UDP包。
   发送的UDP包也是通过DatagramPacket实现的:
byte[] data = ...
packet.setData(data);
ds.send(packet);

客户端

和服务器端相比,客户端使用UDP时,只需要直接向服务器发送UDP包,然后接收返回的UDP包:

//客户端B监听8888端口
		 DatagramSocket socket = new DatagramSocket(9888);
			//提前创建两个Parket数据包,分别用于接收和发送
			DatagramPacket sendPacket1 = new DatagramPacket(new byte[1024],1024,
					new InetSocketAddress("192.168.254.173",9888));//目的地
					
			while(true) {
				//发送
				System.out.println("客户说:");
				String sendContent = input.nextLine();
				sendPacket1.setData(sendContent.getBytes());
				socket.send(sendPacket1);
				
				
				
				if(sendContent.equals("over")) {
					System.out.println("你已经退出聊天");
					return;
				}
				
								
				//接收
				DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024);

				socket.receive(receivePacket);
				
				String receiveContent = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());
				System.out.printf("对象"+"说:"+receiveContent);
				if(receiveContent.equals("over")) {
					System.out.println("对方已经退出聊天");
					return;
				}   
			}
    客户端创建DatagramSocket实例时并不需要指定端口,而是由操作系统自动指定一个当前使用的端口。紧接着,调用setSoTimeout(10000);(超时限定) 。
    如果客户希望发送两个不同的服务器发送的UDP包,那么它必须创建量的DatagramPacket实例。后续的收发数据和服务器端是一致的。
    disconnect()方法并不是真正的断开连接,他只是清楚了客户端DatagramSocket实例记录的远程服务地址和端口号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于UDP实现简易聊天 的相关文章

  • Spring Batch如何作为Reader读取多个表(查询)并将其写入平面文件写入

    在我的项目中 我读取了具有不同查询的多个表 并将这些结果集合并到平面文件中 我该如何实现这一目标 我的意思是 JdbcReader 直接采用 1 个选择查询 我如何自定义它 如果 JdbcCursorItemReader 不能满足您的需求
  • Windows 上的虚假唤醒。是否可以?

    我最近学习了 虚假唤醒 有人说这个问题只可能发生在某些类型的 Linux PC 上 我用的是窗户 我为虚假唤醒编写了测试 我得到的结果是这是可能的 但我想向您展示这个测试 也许我在某个地方犯了错误 我的初始变体 import java ut
  • 模拟框架对我有什么作用?

    我听说有些我无法交谈的人是 jmock 的忠实粉丝 我已经做了以测试为中心的开发多年 所以我浏览了网站并查看了一些文档 但仍然不知道它有什么好处 我对春天也有同样的问题 如果您已经了解它是什么 他们的文档会很好地解释它 所以我并不认为 jm
  • 定制法国号码格式

    我尝试为美国国家 地区使用自定义数字格式 到目前为止效果很好 Not something I want NumberFormat numberFormat0 NumberFormat getNumberInstance Locale US
  • Hamcrest 泛型地狱 #2:iterable With Size 给出错误“不适用于参数”

    在 hamcrest 中 1 3 RC2 没有 JUnit 依赖项 我使用失败iterableWithSize 我有一个 扩展 Iterator参数化为Content像这样EndResult
  • 如何使用 log4j 自动记录类中调用的每个方法

    我有一个包含数据库调用的类 我通常希望使用 log4j 记录该类中调用的每个方法 带参数 logger debug foo id id initiated 可以自动执行此操作吗 也许通过在每个方法的开头使用某种注释而不是编写每个 logge
  • maven + eclipse + tomcat:类未找到异常

    我有一个使用 servlet 的简单 Web 应用程序 我将其创建为 Maven 项目 然后将其导入到 Eclipse 中 文件 gt 导入 gt 现有的 Maven 项目 战争已正确部署到 tomcat 7 但是 当我在 Eclipse
  • JTable AutoCreateRowSorter 将数字排序为字符串

    我有一个 JTable JTable table new JTable String colNames c1 DefaultTableModel model new DefaultTableModel Integer x new Integ
  • 用户“root”@“localhost”的访问被拒绝

    我正在尝试从数据库中获取记录 但我面临这个访问被拒绝的问题 我尝试了 Stack Overflow 上提到的其他解决方案 例如向用户授予权限 但没有任何效果 访问数据库的代码 public void service HttpServletR
  • 如何用java对jpg进行像素化?

    我正在尝试使用 Java 6 对 JPEG 进行像素化 但运气不佳 它需要使用 Java 而不是像 Photoshop 这样的图像处理程序 并且它需要看起来像老派 像这样 有谁能够帮助我 使用java awt image javadoc h
  • 在 Android 中使用 lambdaj

    有人尝试过在android开发中使用lambdaj库吗 当我创建一个简单的小型java应用程序时 它对我来说工作得很好 但我无法在android应用程序中使用它 UPDATE 我正在添加 lambdaj lambdaj 2 3 2 with
  • 如何提高 Guice 启动时的性能

    好吧 我知道我的计算不客观等等 但无论如何 我讨厌在执行单元测试时等待这么多时间 我的 guice swing 应用程序需要大约 7 秒来初始化 这是一个简单的 IRC 客户端 在那一刻 没有打开连接 我什至还没有调用任何 java io
  • 从外部 clojar 导入/使用资源

    我想做的是将一个大文件 MIDI 声音字体 打包到一个独立的 Maven repo clojar 中 然后能够以编程方式将其拉下来并从单独的项目中使用它 事实证明 这个看似简单的任务比我想象的要复杂 理想的情况是 如果有一种方法可以直接访问
  • 如何对JConsole的密码文件的密码进行加密

    我正在使用 JConsole 访问我的应用程序 MBean 并使用 password properties 文件 但根据 Sun 的规范 该文件仅包含明文格式的密码 com sun management jmxremote password
  • 如何在最短的时间内克隆java中的输入流

    有人可以告诉我如何克隆输入流 并花费尽可能少的创建时间吗 我需要多次克隆输入流以使用多种方法来处理 IS 我尝试了三种方法 但由于这样或那样的原因 事情不起作用 方法 1 感谢 stackoverflow 社区 我发现以下链接很有帮助 并将
  • 在Java中一个接一个地播放WAV文件

    我正在尝试玩几个WAV http en wikipedia org wiki WAV文件一个接一个 我尝试了这个方法 for String file audioFiles new AePlayWave file start 但这会同时播放它
  • 对于每个抛出异常的语句,try/catch 是否被视为反模式?

    我目前正在审查同事的 Java 代码 我看到很多情况下 每个可能抛出异常的语句都被封装在自己的 try catch 中 其中 catch 块都执行相同的操作 哪个操作与我的问题无关 对我来说 这似乎是一种代码味道 我记得读到过它是一种常见的
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • 在调试模式下,哪些代码更改会自动反映在 Eclipse 中?

    我使用 eclipse 用于编写 调试 作为 IDE 在调试模式下 当我进行一些更改 例如初始化局部变量 时 它们会自动反映 但其他更改例如更改静态变量的值 有时我会收到一条消息 说我需要重新启动虚拟机 有时则不需要 现在的问题是哪些类型的
  • 文件构造函数说明

    我无法理解以下文件构造函数 public File String parent String child and public File File parent String child 参数有什么作用parent and child该文件

随机推荐

  • Caffe中Layer注册机制

    Caffe内部维护一个注册表用于查找特定Layer对应的工厂函数 Layer Factory的设计用到了设计模式里的工厂模式 Caffe的Layer注册表是一组键值对 key value LayerRegistry里用map数据结构维护一个
  • elementUI项目打包后样式错乱问题解决

    gt npm run dev 时样式完全没有问题 run build之后打包上传服务器之后样式乱了 一脸懵逼 1 检查样式发现重置element的样式没有生效 但是检查main js里面的样式引入顺序没有问题啊 2 尝试将css引入放入ap
  • Unity 宏定义

    一些自带的宏定义 UNITY EDITOR 编辑器调用 UNITY STANDALONE OSX 专门为Mac OS 包括Universal PPC和Intelarchitectures 平台的定义 UNITY DASHBOARD WIDG
  • Markdown、Word中插入公式及序号,并设置公式居中序号右对齐

    Markdown里实现这个功能非常简单 只需要在公式最后插入 tag index 即可 其中index为公式编号 如 S x
  • DNN框架中的NCHW与NHWC数据格式

    流行的深度学习框架中有不同的数据格式 典型的有NCHW和NHWC格式 下面从逻辑表达和物理存储角度用图的方式来理解这两种数据格式 最后以RGB图像为例来加深NHWC和NCHW数据存储格式的理解 Intel R MKL DNN Underst
  • 华为智慧搜索,下一片流量蓝海的“入海口”

    几年前开始 TMT业界就发出了一类质疑的声音 移动互联网的各个APP彼此割裂 是在 孤岛炼油 大量的应用程序和服务互不打通 形成了严重的数据孤岛 用户只能进行站内搜索 很难穿透APP壁垒 进行全局搜索 淮南子 氾论训 中写道 百川异源而皆归
  • Redis笔记&常用指令合集

    1 简介 NoSQL NoSQL Not Only SQL 意即 不仅仅是SQL 泛指非关系型的数据库 NoSQL不依赖业务逻辑方式存储 而以简单的key value模式存储 因此大大的增加了数据库的扩展能力 NoSQL特性 不遵循sql标
  • 关于目前自己iOS项目使用的第三方开源库

    1 AFNetworking 目前比较推荐的iOS网络请求组件 默认网络请求是异步 通过block回调的方式对返回数据进行处理 2 FMDB 对sqlite数据库操作进行了封装 demo也比较简单 3 MBProgressHUD 也是iOS
  • 实践理解 Transactional 是否生效

    实践理解 Transactional 是否生效 示例 新建一个订单表 tb order test 手动插入一条数据 然后在代码中 根据 id 更新 如果更新成功 那么 update time 会变化 代码中执行 1 0 由于 0不能做为除数
  • 【论文解读】PHMLD_Wei-Ting Chen_TIP2020

    问题提出 Related Works 随着学习技术的发展 已经提出了几种基于合成数据的除雾算法 唐等 7 使用随机森林计算每个补丁的传输值 蔡等 8 基于称为DehazeNet的端到端系统 预测了每个补丁的传输值 任等人 9 提出了MSCN
  • [C#]BeforeFieldInit 与类静态构造函数

    BeforeFieldInit 与类静态构造函数 罗朝辉 http kesalin cnblogs com 本文遵循 署名 非商业用途 保持一致 创作公用协议 如下代码 using System namespace BeforeFieldI
  • js识别当前设备是pc端

    项目开发中很多时候会遇到要求系统既要在pc中运行也可以在手机上访问的需求 这是时候就需要判断一下系统运行的平台来做页面适配 在main js中添加如下代码 function identifyDevicePlatform var os fun
  • linux中head方法单独取一行,linux head tail sed用法

    一 head 语法 head n k file 显示前10行 1 head 10 file txt 2 head n 10 file txt 3 head n 10 file txt 除最后k行 显示其它所有 head n 10 file
  • Nginx http_try_files_module precontent阶段 try_files指令

    http try files module http try files module 模块只提供了try files这一个指令 该模块对于我们使用反向代理的时候有很大的帮助 该模块是默认编译进nginx框架当中的 无法将其取消 在搭建wo
  • ExecutorService配置线程池对象、日程线程池对象和基本使用示例

    线程池是高级开发必备的技能之一 线程池在实际开发中使用频率非常高非常重要 这里介绍一下线程池的基本使用方法 一 频繁的创建线程有什么缺点 1 经常创建和销毁线程会消耗非常大的资源 例如并发情况下的线程 对性能影响很大 二 使用线程池的思路
  • 【JAVA】接口与多态

    接口 定义 接口用关键字interface定义 public interface 接口名 特点 接口不能实例化 创建对象 接口和类之间是实现关系 通过implements关键字表示 public class 类名 implements 接口
  • 快递项目——手写MVC实现快递后台和平台

    目录 编写流程 管理员的登陆 快递管理 子模块 编写的流程 标准流程 api文档 用户的管理 子模块 快递员管理 子模块 控制台显示 实体类 MVC Util工具类 微信包 配置文件 补充 ngrok内网穿透 问题汇总 编写流程 管理员的登
  • 汇编语言——串操作指令

    若要处理连续内存单元中的一批数据 通常需要借助于循环 80x86CPU提供了一组串操作指令 可用来处理内存中的数据 字节 字 双字 串 这些指令包括MOVS LODS STOS SCAS CMPS 为了指出操作对象的长度 在助记符后加上B
  • 下载的文件被Windows 11 安全中心自动删除

    今天从CSDN上下载了自己曾经上传的文件 但是浏览器下载完之后文件被Windows安全中心自动删除 说是带病毒 实际是没有病毒的 再说了即便有病毒也不应该直接删除啊 至少给用户一个保留或删除的选项 研究了一番 可以暂时关闭安全中心的实时保护
  • 基于UDP实现简易聊天

    概述 UDP没有创建连接 数据包是一次收发一个 没有流的概念 但是在UDP编程中需要用到的是Socket 因为应用程序在使用UDP时必须指定网络接口 IP地址 和端口号 服务器端 在服务器端 使用UDP也需要监听指定的端口 Java提供了D