网络编程(1)写一个简单的UDP网络通信程序【回显服务器】,并且实现一个简单的翻译功能
使用 JAVA 自带的api
目录
一、回显服务器 UdpEchoServer
服务器代码
客户端代码
二、翻译功能 UdpDictServer
在UdpDictServer里重写process方法
一、回显服务器 UdpEchoServer
/*** 回显服务器* 写一个简单的UDP的客户端/服务器 通信的程序* 这个程序没有啥业务逻辑,只是单纯的调用socket api* 让客户端给服务器发送一个请求,从控制台输入的字符串* 服务器收到字符串后,会把这个字符串原封不动的返回给客户端,客户端再显示出来运行过程* 1.先启动服务器 ,程序会进入while循环,执行到receive()阻塞,等待客户端的请求* 2.再启动客户端,程序也会进入while循环,执行到scanner 等待用户输入* 当用户输入字符串之后,next就会返回,构造请求数据,并发送给服务器* 3.客户端发送数据之后* 服务器就会从receive中返回,进一步执行解析请求UDP报,执行process计算响应操作,最后执行send操作,发送响应结果* 客户端接着执行到receive,等待服务器的响应* 4.客户端接收到服务器响应的数据之后,从receive中返回,执行打印操作,把响应的内容显示出来了* 5. 服务器执行完后,重新进入while循环,又执行到receive这里阻塞* 客户端执行完后,也重新进入while循环,执行到scanner这里阻塞**/
服务器代码
package network;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpEchoServer {//创建一个DatagramSocket对象,后续操作网卡的基础//socket 就是把网卡抽象成了文件//往socket文件中 写数据 ,就相当于通过网卡 发送数据//从socket文件中 读数据 ,就相当于通过网卡 接收数据//把网络通信和文件操作给统一了//在Java中就使用这个类,来表示系统内部的 socket 文件了//常用的socket的方法:receive(DatagramPacket P) ,send(DatagramPacket P), close//DatagramPacket 这个类,用来表示一个UDP数据报//UDP是面向数据报的//每次进行传输,都要以UDP数据包为基本单位private DatagramSocket socket = null;//构造方法//服务器需要手动 显示指定端口号,可以避免端口号冲突//客户端的socket 一般不能显示指定(系统会随机分配一个端口)//传入参数为 int portpublic UdpEchoServer(int port) throws SocketException {//手动指定端口号socket = new DatagramSocket(port);//不带参数就是系统自动分配端口号
// socket = new DatagramSocket();}//服务器启动方法//通过这个方法来启动服务器public void start() throws IOException {//服务器启动提示System.out.println("服务器启动!");//服务器一般开了就不关了,7*24小时不停歇运转,所以是while(true)形式while(true){//1.读取请求并解析//创建UDP数据报 DatagramPacket对象 接收 客户端的数据//收到的数据需要用内存空间保存,而DatagramPacket 内部不能自行分配内存空间//于是需要程序员手动把空间创建好,交给DatagramPacket 进行处理,使用字节数组创建DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);//保存请求信息socket.receive(requestPacket);//接收请求信息。数据没来的时候,会先阻塞,直到客户端把请求发来为止//接收到的数据,是以二进制的形式存储到DatagramPacket中了//要想显示出来,需要将这个二进制数据转换成字符串String request = new String(requestPacket.getData(),0,requestPacket.getLength());//参数为 二进制数据,偏移量从0开始到requestPacket.getLength()这个数据结尾//2.根据请求计算响应//实际开发项目中,服务器中最核心的步骤,绝大数程序都是在完成这一部分String response = process(request);//3.把响应写回到客户端// 创建响应对象,DatagramPacket// 往这个对象里构造刚才的数据,再通过send返回DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());//传入的参数 获取 数据的起始地址response.getBytes(),数据的字节长度response.getBytes().length,响应给 客户端的ip地址requestPacket.getSocketAddress()//指定字节数组缓冲区,同时指定 客户端UDP请求报中的网卡信息requestPacket.getSocketAddress()(其中包含了ip和端口号)//网络传输,使用字节,以字节为单位socket.send(responsePacket);//4.打印一个日志,把这次数据交互的详情打印出来System.out.printf("[%s:%d] request=%s response=%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);//打印的内容:客户端的ip:客户端的端口号 请求内容 响应内容}}//响应程序//这里只是简单回显
//这里写public才能被重写public String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer server = new UdpEchoServer(9090);server.start();}
}
客户端代码
package network;import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket = null;//对网卡进行操作,接收或发送数据报,或者关闭//因为UDP报不会建立链接,也不会存储对端的信息//所以在应用程序里把它存储起来private String serverIp = "";private int serverPort = 0;public UdpEchoClient(String ip , int port) throws SocketException {//客户端不能指定端口号码,会端口冲突socket = new DatagramSocket();//客户端 系统随机分配端口,不写参数就是系统随机分配//因为UDP报不会建立链接,也不会存储对端的信息//所以在应用程序里把它存储起来//这里主要记录对端的 ip 和 端口serverIp = ip;serverPort = port;}//启动客户端程序public void start() throws IOException {//启动客户端提示System.out.println("客户端启动!");//用户输入字符串Scanner scanner = new Scanner(System.in);while(true){//1.从控制台读取数据,作为请求System.out.print("->");//输入提示符String request = scanner.next();//请求信息的内容//2.把请求内容构造成一个DatagramPacket对象,发送给服务器DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp),serverPort);//request.getBytes(),request.getBytes().length指定字节数组缓冲区,同时指定 ip 和 端口号 InetAddress.getByName(serverIp),serverPortsocket.send(requestPacket);//发送UDP数据报//3.尝试读取客户端的响应DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);//创建一个空的UDP数据报来接收服务器的响应数据socket.receive(responsePacket);//4.把接收的响应数据 由二进制 转换成 字符串 显示出来String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1",9090);//该参数为对端(服务器)的ip和端口client.start();}
}
运行结果:
* 1.先启动服务器 ,程序会进入while循环,执行到receive()阻塞,等待客户端的请求

* 2.再启动客户端,程序也会进入while循环,执行到scanner 等待用户输入

* 当用户输入字符串之后,next就会返回,构造请求数据,并发送给服务器
* 3.客户端发送数据之后
* 服务器就会从receive中返回,进一步执行解析请求UDP报,执行process计算响应操作,最后执行send操作,发送响应结果
* 客户端接着执行到receive,等待服务器的响应
* 4.客户端接收到服务器响应的数据之后,从receive中返回,执行打印操作,把响应的内容显示出来了


* 5. 服务器执行完后,重新进入while循环,又执行到receive这里阻塞 * 客户端执行完后,也重新进入while循环,执行到scanner这里阻塞 * */
二、翻译功能 UdpDictServer
在回显服务器的基础上,创建一个新的类,继承回显服务器
在UdpDictServer里重写process方法
package network;import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;public class UdpDictServer extends UdpEchoServer{private Map<String,String> dict = new HashMap<>();
//重写构造方法public UdpDictServer(int port) throws SocketException {super(port);dict.put("猫","cat");dict.put("狗","dog");dict.put("今天","today");dict.put("cat","猫");dict.put("dog","狗");dict.put("today","今天");}//重写父类 UdpEchoServer 的process方法//完成翻译逻辑,翻译本质上是“查表”//刚才再dict哈希表里添加了一些键值对元素//刚才在重写的地方报错//原因是 父类的process方法之前用的是private//而private封装特性,不能被重写//改成public之后就可以了@Overridepublic String process(String request) {
// return dict.get(request);return dict.getOrDefault(request,"该单词目前不在表中,无法查看!!");//差不到表中信息,可以给默认值}public static void main(String[] args) throws IOException {//如果端口号也是9090就与父类的端口号冲突了UdpDictServer dictServer = new UdpDictServer(6666);//指定这个翻译功能 的端口是6666dictServer.start();//此时,这里调用start的是子类UdpDictServer,所以后面调用的process也是子类重写的方法//这里就是之前学到的多态}
}
注意:
翻译服务器里main方法里的端口要与父类不一样,避免端口号冲突
同时客户端开启的时候,要把端口号修改过来6060,不然服务器就连错了
运行结果

相关文章:
网络编程(1)写一个简单的UDP网络通信程序【回显服务器】,并且实现一个简单的翻译功能
使用 JAVA 自带的api 目录 一、回显服务器 UdpEchoServer 服务器代码 客户端代码 二、翻译功能 UdpDictServer 在UdpDictServer里重写process方法 一、回显服务器 UdpEchoServer /*** 回显服务器* 写一个简单的UDP的客户端/服务器 通信的程序* 这个程序没有啥业务逻辑&am…...
Ansys Speos | Light Expert Group探测器组使用技巧
附件下载 联系工作人员获取附件 概述 相机挡板的设计需要在光路的不同位置同步多个照度图,以尽量减少杂散光。2023R2 Speos提供了一种新的探测器,用于高阶杂散光分析,可以同时对多个探测器进行光线追迹。Light Expert工具可以即时过滤3D视…...
C#学习笔记3:Windows窗口计时器
今日继续我的C#学习之路,今日学习自己制作一个Windows窗口计时器程序: 文章提供源码解释、步骤操作、整体项目工程下载 完成后的效果大致如下:(可选择秒数,有进度条,开始计时按钮等) …...
C语言与sqlite3入门
c语言与sqlite3入门 1 sqlite3数据类型2 sqlite3指令3 sqlite3的sql语法3.1 创建表create3.2 删除表drop3.3 插入数据insert into3.4 查询select from3.5 where子句3.6 修改数据update3.7 删除数据delete3.8 排序Order By3.9 分组GROUP BY3.10 约束 4 c语言执行sqlite34.1 下载…...
Rancher(v2.6.3)——安装Rancher
[详细安装说明请查看Rancher安装说明文档]:https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#1%E5%AE%89%E8%A3%85rancher Rancher部署Mysql(单机版):http…...
Aapche Nutch建立自己的搜索引擎
sudo apt install default-jdk‘ java -version openjdk version "11.0.22" 2024-01-16 vi .bashrc export JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 爬梯子下载源代码 Apache Nutch™ – Downloads mkdir -p urls cd urls touch seed.txt 里面放入我的网站…...
阅读笔记(ICIP2023)Rectangular-Output Image Stitching
“矩形输出”图像拼接 Zhou, H., Zhu, Y., Lv, X., Liu, Q., & Zhang, S. (2023, October). Rectangular-Output Image Stitching. In 2023 IEEE International Conference on Image Processing (ICIP) (pp. 2800-2804). IEEE. 0. 摘要 图像拼接的目的是将两幅视场重叠的…...
就业班 第二阶段 2401--3.26 day6 Shell初识 连接vscode
远程连接vs_code可能出现的问题 C:\Users\41703\.ssh 验证远程主机的身份,如果连不上vscode,可以尝试删除这里面的公钥代码。 重新安装那个扩展,排除扩展本身的问题 谁连过我,并操作了什么 curl https://gitea.beyourself.org.c…...
碳课堂|什么是碳资产?企业如何进行碳资产管理?
碳资产是绿色资产的重要类别,在全球气候变化日益严峻的背景下备受关注。在“双碳”目标下,碳资产管理是企业层面实现碳减排目标和低碳转型的关键。 一、什么是碳资产? 碳资产是以碳减排为基础的资产,是企业为了积极应对气候变化&…...
如何使用 ChatGPT 进行编码和编程
文章目录 一、初学者1.1 生成代码片段1.2 解释功能 二、自信的初学者2.1 修复错误2.2 完成部分代码 三、中级水平3.1 研究库3.2 改进旧代码 四、进阶水平4.1 比较示例代码4.2 编程语言之间的翻译 五、专业人士5.1 模拟 Linux 终端 总结 大多数程序员都知道,ChatGPT …...
学习java第二十四天
spring框架中有哪些不同类型的事件 Spring 提供了以下5种标准的事件: 上下文更新事件(ContextRefreshedEvent):在调用 ConfigurableApplicationContext 接口中的refresh方法时被触发。 上下文开始事件(ContextStart…...
中小型集群部署,Docker Swarm(集群)使用及部署应用介绍
1、Docker Swarm简介 说到集群,第一个想到的就是k8s,但docker官方也提供了集群和编排解决方案,它允许你将多个 Docker 主机连接在一起,形成一个“群集”(Swarm),并可以在这个 Swarm 上运行和管…...
gateway做负载均衡
在Spring Cloud中,Gateway可以通过配置文件来实现负载均衡。以下是一个简单的配置示例,它演示了如何将请求代理到名为service-instance的服务的两个不同实例。 spring:cloud:gateway:routes:- id: service-instance-routeuri: lb://service-instancepre…...
pytorch中的torch.hub.load()
pytorch提供了torch.hub.load()函数加载模型,该方法可以从网上直接下载模型或是从本地加载模型。官方文档 torch.hub.load(repo_or_dir, model, *args, sourcegithub, trust_repoNone, force_reloadFalse, verboseTrue, skip_validationFalse, **kwargs)参数说明&a…...
R语言学习——Rstudio软件
R语言免费但有点难上手,是数据挖掘的入门级别语言,拥有顶级的可视化功能。 优点: 1统计分析(可以实现各种分析方法)和计算(有很多函数) 2强大的绘图功能 3扩展包多,适合领域多 …...
触发器的工艺结构原理及选型参数总结
🏡《总目录》 目录 1,概述2,工作原理3,结构特点4,工艺流程4.1,掩膜制作4.2,晶片生长4.3,晶片切割4.4,晶片清洗4.5,掩膜光刻4.6,金属沉积5,选型参数5.1,触发类型5.2,触发频率...
Hana数据库 No columns were bound prior to calling SQLFetch or SQLFetchScroll
在php调用hana数据库的一个sql时报错了,查表结构的sql: select * from sys.table_columns where table_name VBAP SQLSTATE[SL009]: <<Unknown error>>: 0 [unixODBC][Driver Manager]No columns were bound prior to calling SQLFetch …...
DevOps是什么
DevOps 是一种将软件开发 (Dev) 和 IT运维 (Ops) 结合起来的实践、文化和哲学,旨在缩短系统开发生命周期,提供高质量的软件持续交付。它涉及多个关键实践和工具,其核心目的是加强开发和运维团队之间的协作和通信。以下是构成DevOps的一些重要…...
windows下的vscode + opencv4.8.0(C++) 配置
1.添加环境变量 D:\mingw64\bin 2.安装vscode 3.下载opencv 4.8.0 4.程序引用第三方库(opencv为例) 打开CMakeLists.txt,引入头文件,使用include_directories 加入头文件所在目录。静态链接库link_directories # 头文件 include_directories(D:/ope…...
微信小程序之多视频暂停播放,超出可视区域停止播放视频在自定义组件中实现案例
项目页面存在多个视频时,只播放视频可见范围内单个视频播放的解决方案 QQ录屏20240326175303 在自定义组件中无onPageScroll(e)监听页面滚动的函数所以在自定义组件中用<scroll-view>标签包裹所有组件(以下为WXML页面源码) <scroll…...
只剩马斯克自己!xAI 11个联合创始人跑光了
11位联合创始人三年出清、只剩马斯克一人,xAI这场「天团散伙」背后,藏着AI时代最残酷的人才战争与帝国裂缝。3月28日,Ross Nordeen悄悄摘掉了自己在X平台上的xAI员工认证标识。他发了一张照片——「触碰一些草」。没有长篇告别信,…...
PingFangSC字体全栈应用指南:从技术原理到性能优化
PingFangSC字体全栈应用指南:从技术原理到性能优化 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 解析字体技术原理:为什么格式选…...
Torch-Pruning高效剪枝实战:解决BERT模型部署中的计算资源瓶颈问题
Torch-Pruning高效剪枝实战:解决BERT模型部署中的计算资源瓶颈问题 【免费下载链接】Torch-Pruning [CVPR 2023] Towards Any Structural Pruning; LLMs / Diffusion / Transformers / YOLOv8 / CNNs 项目地址: https://gitcode.com/gh_mirrors/to/Torch-Pruning …...
VisualVM企业级部署指南:大规模Java应用监控最佳实践
VisualVM企业级部署指南:大规模Java应用监控最佳实践 【免费下载链接】visualvm VisualVM is an All-in-One Java Troubleshooting Tool 项目地址: https://gitcode.com/gh_mirrors/vi/visualvm VisualVM是一款功能强大的全合一Java故障排除工具,…...
如何高效定制Steam界面:实用美化插件开发指南
如何高效定制Steam界面:实用美化插件开发指南 【免费下载链接】millennium-steam-patcher Apply themes/customize Steam after the 2023-04-27 Chromium UI update https://discord.gg/MXMWEQKgJF 项目地址: https://gitcode.com/gh_mirrors/mi/millennium-steam…...
跨平台OCR新利器:PP-OCRv5模型转ONNX实战指南,轻松应对多语言识别挑战
1. 为什么需要跨平台OCR解决方案 在日常工作和生活中,我们经常会遇到需要处理多语言文档的场景。比如收到一份包含中文、英文和日文的合同,或者需要从产品包装上识别不同语言的说明文字。传统OCR方案往往需要针对不同语言训练多个模型,不仅部…...
终极color库API参考手册:从入门到精通CSS颜色处理
终极color库API参考手册:从入门到精通CSS颜色处理 【免费下载链接】color 项目地址: https://gitcode.com/gh_mirrors/col/color color库是一个功能强大的JavaScript库,专为颜色转换和操作而设计,支持CSS颜色字符串,让开发…...
【单片机实战】中断服务程序编写精要:从现场保护到中断返回
1. 中断服务程序的核心作用与基本结构 第一次接触单片机中断时,我盯着开发板上的按键发愣——明明没有循环检测IO口状态,按下按键却能立即触发LED亮灭。这种"随叫随到"的响应机制,就是中断服务程序(ISR)的魔…...
别再只用DataParallel了!PyTorch单机多卡训练保姆级教程(从DP到DDP实战避坑)
从DataParallel到DDP:PyTorch单机多卡训练深度优化指南 当你的模型参数突破1亿大关,单卡训练时间从几小时延长到几天时,多GPU并行训练就从一个可选项变成了必选项。但面对PyTorch提供的DataParallel(DP)和DistributedDataParallel(DDP)两种方…...
CVPR 2026 手物交互数据生成新SOTA
Project Page: https://gasaiyu.github.io/PAM.github.io/01▪ 在只给定初始姿态、目标姿态和不含外观的物体几何信息的输入下,如何直接生成逼真的手物交互(HOI)视频?▪ 现有方法存在一系列问题:姿态合成方法只能预测 …...
