java中网络编程UDP在线咨询案例(DatagramSocket)

2023-11-07

方法1:单线程(单方向发送接收):

发送端:UdpTalkClient.java

步骤流程:1.使用DatagramSocket 指定端口 创建发送端

                  2.准备数据一定转成字节数组

                  3.封装DatagramSocket包裹,需要指定目的地

                  4.发送包裹

                  5.释放资源

以下为代码案例:

package com.bl.d;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class UdpTalkClient {
	public static void main(String[] args) throws Exception {
		System.out.println("输入端正在运行");
		//使用DatagramSocket 指定端口 创建发送端
		DatagramSocket client = new DatagramSocket(8888);
//		准备数据一定转成字节数组
		while(true) {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		String Data = reader.readLine();
		byte[] datas = Data.getBytes();
		//封装DatagramSocket包裹,需要指定目的地
		DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
//		发送包裹
		client.send(packet);
		if(Data.equals("Bye")) {
			break;
		}}
//		释放资源
		client.close();
		}
}

接收端:UdpTalkServer.java

步骤流程:1.使用DatagramSocket 创建端口 ,创建接收端;

                  2.分析数据

                  3.准备容器 封装成DatagramPacket 包裹

                  4.阻塞式接收包裹receive(DatagramPacket p)

                  5.释放资源

以下为代码案例:

package com.bl.d;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpTalkServer {
	public static void main(String[] args) throws Exception {
		System.out.println("接收端正在运行");
//		1.使用DatagramSocket 创建端口 ,创建接收端;
		DatagramSocket server = new DatagramSocket(6666);
//		2.//分析数据
		while(true) {
//			3.//准备容器 封装成DatagramPacket 包裹
			byte[] container =new byte[1024*60];
			DatagramPacket packet = new DatagramPacket(container,0,container.length);
//			4.//阻塞式接收包裹receive(DatagramPacket p)
			server.receive(packet);
		byte[] datas = packet.getData();
		int Len = packet.getLength();
		String data = new String(datas,0,Len);
		System.out.println(data);
		if(datas.equals("Bye")) {
			break;
		}
		}
//		释放资源
		server.close();
		}
}

方法2:多线程+面向对象封装(双向发送接收):

封装案例:TalkSend.java

通过UdpTalkClient.java封装得到如下:

package com.bl.d;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class TalkSend implements Runnable {
	private DatagramSocket client ;
	private BufferedReader reader;
	private String toIP;
	private int toPort;
	public TalkSend(int port,String toIP,int toPort) {
		this.toIP = toIP;
		this.toPort = toPort;
		try {
			client= new DatagramSocket(port);
			reader = new BufferedReader(new InputStreamReader(System.in));
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {

			 
			String Data;
			try {
				Data = reader.readLine();
				byte[] datas = Data.getBytes();
				//封装DatagramSocket包裹,需要指定目的地
				DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));
//				发送包裹
				client.send(packet);
				if(Data.equals("Bye")) {
					break;
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
		client.close();
	}
	
}

封装案例TalkRecive.java

通过UdpTalkServer.java封装得到。

package com.bl.d;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TalkRecive implements Runnable {
	private DatagramSocket server;
	public TalkRecive(int port) {
		try {
			
			server = new DatagramSocket(port);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			//准备容器 封装成DatagramPacket 包裹
			byte[] container =new byte[1024*60];
			DatagramPacket packet = new DatagramPacket(container,0,container.length);
			//阻塞式接收包裹receive(DatagramPacket p)
			try {
				byte[] datas = packet.getData();
				int Len = packet.getLength();
				String data = new String(datas,0,Len);
				System.out.println(data);
				if(datas.equals("Bye")) {
					break;
				}
				server.receive(packet);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
		}
//		释放资源
		server.close();
		}
	}


对象TalkStudents.java(学生):

创建开启接收和发送端口线程:

package com.bl.d;

public class TalkStudents {
	public static void main(String[] args) {
		new Thread(new TalkRecive(9998)).start();
		new Thread(new TalkSend(2222,"localhost",1111)).start();
	}
}

2222为发送端口,1111为发送目的地端口,9998为接收端口。

对象TalkTeacher.java(老师):

创建开启接收和发送端口线程:

package com.bl.d;

public class TalkTeacher {
	public static void main(String[] args) {
		new Thread(new TalkRecive(1111)).start();
		new Thread(new TalkSend(4444,"localhost",9998)).start();
		
	}
}

4444为发送端口,9998为发送目的地端口,1111位接收端口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中网络编程UDP在线咨询案例(DatagramSocket) 的相关文章

  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • RobotFramework入门(一)简要介绍及使用

    前言 本章主要讲述Robotframework的简要介绍及使用 一 简要介绍 Robotframework 是一个基于Python语言开发的 可扩展的 是关键字驱动模式的自动化测试框架 Robotframework最新的版本是2019年7月
  • python用神经网络进行二分类,并用网格搜索进行调参,写出代码

    在 Python 中使用神经网络进行二分类的一般流程如下 导入所需的库 如 numpy 和 keras 准备好训练数据和测试数据 定义神经网络模型 在训练数据上训练神经网络 在测试数据上评估神经网络的准确度 如果要使用网格搜索来调参 可以使
  • 千万数据量下的真实业务场景SQL性能优化!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 前 言 通过前几期文章的积累 现在我们的理论知识已经极为扎实了 这个时候就可以动手开始sql优化了 sql优化是非常重要 因为即使再好的MySQL设计架构 也扛不住一
  • mysql8.0 mysqld: File './binlog.index' not found

    2019独角兽企业重金招聘Python工程师标准 gt gt gt mysql8 0启动时报错 mysqld File binlog index not found OS errno 13 Permission denied 修改数据库的路
  • Linux静态库与动态库

    Linux动态库与静态库 前言 Linux动态库与静态库介绍 静态库与动态库的优缺点 代码说明 静态库演示 静态库的命名规则 静态库的制作步骤 静态库的使用 动态库演示 动态库的命名规则 动态库的制作步骤 动态库的使用 静态库与动态库的使用
  • 怎么用Wireshark抓包QQ的到对方的IP地址

    怎么用Wireshark抓包QQ的到对方的IP地址 通过wireshark抓包工具得到对方的IP 一 wireshark Wireshark 前称Ethereal 是一个网络封包分析软件 网络封包分析软件的功能是撷取网络封包 并尽可能显示出
  • matlab 画图

    转 matlab 画图plot 标记符大小调整和填充 2014 01 15 21 00 23 转载 标签 it 分类 Matlab 原文地址 http xiangyan0212 blog 163 com blog static 207037
  • ajax代码复用,可重用的JS ajax模式(jquery)

    我想知道是否有更好的方法来为jquery创建可重用的ajax对象 这是我未经测试的代码 var sender function ajax url type dataType callback ajax url url type type d
  • 【计算机视觉40例】案例22:目标检测(YOLO方法、SSD方法)

    导读 本文是专栏 计算机视觉40例简介 的第22个案例 目标检测 YOLO方法 SSD方法 该专栏简要介绍李立宗主编 计算机视觉40例 从入门到深度学习 OpenCV Python 一书的40个案例 目前 该书已经在电子工业出版社出版 大家
  • 21天Jenkins打卡Day10-自动触发项目构建

    参考文档 http istester com jenkins 437 html
  • 【atlas】atlas 编译报错整理(全)

    前言 最近在编译 apache altas 1 1版本 在编译过程中遇到很多报错 这里整理并记录一下 问题一 org restlet jee 包找不到 问题原因 Maven主仓库中找不到包的解决办法 如org restlet jee not
  • Linux 管道pipeline

    管道符 tar归档目录 gzip压缩 ssh传输并用cat读取标准输入到文件 tar cf kernel linux 6 4 7 gzip ssh user 192 168 123 144 cat gt destination tar gz
  • PyQt学习笔记:使用QtWidgets.qApp实现在程序中随时访问应用的方法

    PyQt学习笔记 使用QtWidgets qApp实现在程序中随时访问应用的方法 在PyQt中 QtWidgets qApp是一个全局变量 它提供了一种在程序中随时访问应用的方法 通过使用qApp 我们可以轻松地获取到应用的实例 并且可以使
  • 模式识别——特征提取(表达)

    特征表达 特征是机器学习系统的原材料 对最终模型的影响是毋庸置疑的 如果数据被很好地表达成了特征 通常线性模型就能达到满意的精度 关于特征 需要考虑以下三方面 1 特征表示的粒度 需要考虑 模型在一个什么程度上的特征表示 才能发挥效果 以图
  • tomcat堆栈中10大常见线程详解

    Tomcat作为一个服务器来讲 必然运行着很多的线程 而每一个线程究竟是干什么的 这个需要非常的清楚 无论是打印断点 还是通过jstack进行线程栈分析 这都是必须要掌握的技能 本文带你基于Tomcat7 8 9的版本 识别Tomcat堆栈
  • Cool! TineEye 图片逆向搜索

    Tineye 是世界上第一个逆向图片搜索引擎 可以根据你提交的图片在Internet找到类似图片 下面是Tineye网站上的一些搜索例子 很神奇吧 Cool Searches click image to search This page
  • 爱心代码(web前端)陈飞宇李峋同款

    文章目录 前言 一 效果图 二 操作步骤 第一步 第二步 第三步 第四步 第五步 第六步 源码 前言 最近随着电视剧 点燃我温暖你 的火热播出 剧中帅气学霸李洵的炫酷爱心代码也迅速火出了圈 爱心素材也异常火爆 我在这里整理了一份大家有需自取
  • 使用YOLOv5检测大宽高比(细长目标)时无法检测问题的解决方法

    在深度学习的工程中总会遇到许许多多的奇奇怪怪的问题 使人头大 上周五Franpper在使用yolov5 5 0训练时就遇到了这么一个奇怪的问题 在训练过程中labels一直为0 表示没有读进去标签 虽然可以训练 但是是无效训练 因为网络也不
  • 【硬件】对电源模块的梳理(包括DC-DC、LDO等不同芯片应用电路)

    目录 1 DC DC 变换器 ME3116 24V转5V JW5017S 18V转5V CX802 输入电压 4 5 80V 输出电压5V 输出电流1 2A LM2596S ADJ 输入电压3 3 40V 输出电压5V 2 LDO 低压差
  • java中网络编程UDP在线咨询案例(DatagramSocket)

    方法1 单线程 单方向发送接收 发送端 UdpTalkClient java 步骤流程 1 使用DatagramSocket 指定端口 创建发送端 2 准备数据一定转成字节数组 3 封装DatagramSocket包裹 需要指定目的地 4