网络编程(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…...

Java 加载外部 Jar 中的类并通过反射调用类中的方法
目录 问题 类加载器 获取外部 jar 包中的类以及方法 调用外部 jar 包中的方法 问题 工作中遇到一个需求,客户端将第三方的 jar 包上传到服务器中,系统需要解析出上传的 jar 中所有类以及类下的方法(方法名,方法输入参数类型&…...

Arduino+ESP8266+华为云物联网平台实现智能开关
前言 最近在做一个物联网项目,涉及到智能开关的开发。目前已经实现简单的TCP通信远程控制,但是考虑到后期的设备管理以及设备通信所需要的技术和服务器的维护成本,我决定将设备接入云平台。本文将详细阐述如何利用华为云的物联网平台&#x…...

使用 python 拆分 excel 文件
文章目录 1、安装虚拟环境(在特定文件夹内)2、脚本 split.sh3、运行脚本(在特定文件夹内)4、结果 1、安装虚拟环境(在特定文件夹内) brew install python3 xcode-select --install python3 -m venv my_pan…...

uniapp小程序中onShareAppMessage(OBJECT)实现带参数的分享功能
一、引言 小程序中用户点击分享后,在 js 中定义 onShareAppMessage 处理函数(和 onLoad 等生命周期函数同级),设置该页面的分享信息。 用户点击分享按钮的时候会调用。这个分享按钮可能是小程序右上角原生菜单自带的分享按钮&…...

5个免费的3D钣金CAD软件
如果你正在设计简单的折叠钣金零件,则只需设计一些具有圆角半径的法兰:一个简单的钣金模块。 首先,你可以采用老式方式绘图并以 2D 方式完成所有操作。 许多传统制造商仍在使用 2D DWG 和 DXF 图纸。 因此,你很有可能只需快速起草…...

3.26学习总结
java 实例变量和局部变量 实例变量是记录这个类中对象的特点的每一个对象的实例变量都可以不同(例如名字,性别等),其中一个对象的实例变量改变不会影响其他的变量. 类变量是一种特殊的实例变量,他的特殊在于所有的对象的类变量都是相同的,当一个对象改变了类变量那么所有对象…...

Cisco Catalyst3850交换机RTU license使用方法
1 情况说明 客户处采购了4台3850-14T交换机,在配置的时候发现OSPF不支持, 查询原因为当前license不支持 (lanbase, 只能支持2层功能) 报错如下: Access-3850-1(config)#router ospf 100 Protocol not in this image2 如何处理&a…...

简明 Python 教程(第5章 函数)
本章介绍了函数的基本概念和使用方法,包括定义函数、传递参数、局部变量、全局变量、默认参数、关键字参数、返回值和文档字符串。 掌握这些概念对于编写结构化和可维护的Python代码至关重要。 定义函数 使用def关键字 定义函数始于def关键字,它告诉P…...

flutter 保存一堆多语言翻译词条,由key和value组成
原理: 1.从String列表里面获取某个value: List<String> jsonStrings [{"name": "John", "age": 30},{"name": "Jane", "age": 25},{"name": "Bob", "age…...

3月25日,每日信息差
🎖 素材来源官方媒体/网络新闻 🎄 京东汽车将和小米汽车进行深度合作 🌍 百度将为苹果国行iPhone16提供AI功能?百度方面称暂无回应 🌋 国产结核病新型mRNA疫苗即将问世 🎁 美国发布严重地磁暴预警ÿ…...