当前位置: 首页 > news >正文

使用Socket实现UDP版的回显服务器

文章目录

  • 1. Socket简介
  • 2. DatagramSocket
  • 3. DatagramPacket
  • 4. InetSocketAddress
  • 5. 实现UDP版的回显服务器

在这里插入图片描述

1. Socket简介

Socket(Java套接字)是Java编程语言提供的一组类和接口,用于实现网络通信。它基于Socket编程接口,提供了一种简单而强大的方式来实现网络应用程序。

socket类库提供了丰富的方法和功能,用于处理网络通信的各个方面。它支持TCP和UDP协议,可以实现可靠的、面向连接的通信(TCP)或不可靠的、无连接的通信(UDP)。Java Socket还提供了一些高级功能,如多线程处理、异步通信、加密通信等,以满足不同网络应用的需求。

本文主要使用Socket实现UDP版的客户端和服务器

  • DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。

  • DatagramPacket是UDP Socket发送和接收的数据报。

2. DatagramSocket

DatagramSocket是Java网络编程中用于实现UDP协议的类。它是基于Socket类的子类,用于发送和接收UDP数据报。

DatagramSocket 的构造方法:

方法说明
DatagramSocket()创建一个UDP数据报套接字的socket,绑定本机任意一个随机端口(一般用户客户端)
DatagramSocket(int port)创建一个UDP数据套接字的socket,绑定指定的port端口(一般用于服务端)

DatagramSocket的常用方法如下:

方法说明
void receive(DatagramPacket p)从此套接字接收数据报,如果没有接收到数据报,会阻塞等待
void send(DatagramPacket p)从此套接字发送数据包
void close()关闭数据报套接字

3. DatagramPacket

DatagramPacket是Java网络编程中用于封装和解析UDP数据报(Datagram)的类。它用于在DatagramSocket中发送和接收UDP数据报

DatagramPacket的构造方法:

方法说明
DatagramPacket(byte[] buf, int length)构造一个DatagramPacket以用来接收数据报,接收的数据保存在 字节数组(第一个参数buf)中,接收指定长度(第二个参数 length)
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)构造一个DatagramPacket以用来发送数据报,发送的数据为字节 数组(第一个参数buf)中,从0到指定长度(第二个参数 length)。address指定目的主机的IP和端口号

DatagramPacket的常用方法:

方法说明
InetAddress getAddress()从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取 接收端主机IP地址
int getPort()从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号
byte[] getData()获取数据报中的数据

4. InetSocketAddress

InetSocketAddress是Java网络编程中用于表示IP地址和端口号的类。它是SocketAddress类的子类,用于在网络通信中指定主机的地址和端口。

简单介绍一下InetSocketAddress的构造方法:

InetSocketAddress(InetAddress addr,int port)创建一个Socket地址,包含IP地址和端口号

5. 实现UDP版的回显服务器

回显服务器(Echo Server)是一种简单的网络服务器应用,它接收客户端发送的数据,并将接收到的数据原样返回给客户端。

客户端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket = null;private String serverIp;private int serverPort;public UdpEchoClient(String serverIp, int serverPort) throws SocketException {socket = new DatagramSocket(serverPort);this.serverIp = serverIp;this.serverPort = serverPort;}public void start() throws IOException {System.out.println("客户端上线!");Scanner scanner = new Scanner(System.in);while (true) {// 读取用户输入的内容System.out.println("-> ");String request = scanner.next();// 构造 UDP请求,并发送给服务器DatagramPacket reqPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,InetAddress.getByName(this.serverIp), this.serverPort);socket.send(reqPacket);// 从服务器读取响应DatagramPacket respPacket = new DatagramPacket(new byte[4096], 4096);socket.receive(respPacket);String resp = new String(respPacket.getData(), 0, respPacket.getLength());}}public static void main(String[] args) throws IOException {UdpEchoClient echoClient = new UdpEchoClient("127.0.0.1", 6666);echoClient.start();}
}

服务器代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpEchoServer {private DatagramSocket socket = null;// port 为服务器要绑定的端口public UdpEchoServer(int port) throws SocketException {socket = new DatagramSocket(port);}/*** 服务器启动方法*/public void start() throws IOException {System.out.println("服务器启动!");while (true) {// 读取请求并解析DatagramPacket reqPacket = new DatagramPacket(new byte[4096], 4096);socket.receive(reqPacket);// 解析请求String req = new String(reqPacket.getData(), 0, reqPacket.getLength());// 计算响应String resp = process(req);// 将响应返回给客户端DatagramPacket respPacket = new DatagramPacket(resp.getBytes(), resp.getBytes().length,reqPacket.getSocketAddress());socket.send(respPacket);// 打印日志System.out.printf("[%s:%d] req: %s;resp: %s\n", reqPacket.getSocketAddress().toString(),reqPacket.getPort(), req, resp);}}/*** 根据请求计算响应* 因为是 回显服务器,直接返回即可** @param req*/private String process(String req) {return req;}public static void main(String[] args) throws IOException {UdpEchoServer echoServer = new UdpEchoServer(6666);echoServer.start();}
}

运行流程:
在这里插入图片描述

运行结果:

在这里插入图片描述

在这里插入图片描述

另外服务器是给多个客户端提供服务器的,IDEA默认是无法启动多个客户端的,因此手动设置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

相关文章:

使用Socket实现UDP版的回显服务器

文章目录 1. Socket简介2. DatagramSocket3. DatagramPacket4. InetSocketAddress5. 实现UDP版的回显服务器 1. Socket简介 Socket(Java套接字)是Java编程语言提供的一组类和接口,用于实现网络通信。它基于Socket编程接口,提供了…...

【MCU学习】GD32F427VG开发

(一)学习文档和例程 兆易创新GD32 MCU参考资料下载 1.GD232F4xx的Keil芯片支持包 2.标准固件库和示例程序 3.GD32F4xx_固件库使用指南_Rev1.2 4.用户手册:GD32F4xx_User_Manual_Rev2.8_CN 5.数据手册:GD32F427xx_Datasheet_Rev…...

Acwing.877 扩展欧几里得算法

题目 给定n对正整数ai , bi,对于每对数,求出一组ai ,g,使其满足ai* xi bi * yi gcd(ai ,bi)。 输入格式 第一行包含整数n。 接下来n行,每行包含两个整数ai , bi。 输出格式 输出共n行,对于每组ai, bi&#xff0c…...

基于自组织竞争网络的患者癌症发病预测(matlab代码)

1.案例背景 1.1自组织竞争网络概述 前面案例中讲述的都是在训练过程中采用有导师监督学习方式的神经网络模型。这种学习方式在训练过程中,需要预先给网络提供期望输出,根据期望输出来调整网络的权重,使得实际输出和期望输出尽可能地接近。但是在很多情况下,在人们认知的过程中…...

golang mongodb

看代码吧 package main// 链接案例 https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-example // 快速入门 https://www.mongodb.com/docs/drivers/go/current/quick-start/ import ("context""fmt""log"…...

docker中的jenkins去配置sonarQube

docker中的jenkins去配置sonarQube 1、拉取sonarQube macdeMacBook-Pro:~ mac$ docker pull sonarqube:8.9.6-community 8.9.6-community: Pulling from library/sonarqube 8572bc8fb8a3: Pull complete 702f1610d53e: Pull complete 8c951e69c28d: Pull complete f95e4f8…...

企业如何实现自己的AI垂直大模型

文章目录 为什么要训练垂直大模型训练垂直大模型有许多潜在的好处训练垂直大模型也存在一些挑战 企业如何实现自己的AI垂直大模型1.确定需求2.收集数据3.准备数据4.训练模型5.评估模型6.部署模型 如何高效实现垂直大模型 ✍创作者:全栈弄潮儿 🏡 个人主页…...

Maven可选依赖和排除依赖简单使用

可选依赖 可选依赖指对外隐藏当前所依赖的资源 在maven_04_dao的pom.xml,在引入maven_03_pojo的时候&#xff0c;添加optional <dependency><groupId>com.rqz</groupId><artifactId>maven_03_pojo</artifactId><version>1.0-SNAPSHOT&…...

“深入探索JVM:Java虚拟机的工作原理解析“

标题&#xff1a;深入探索JVM&#xff1a;Java虚拟机的工作原理解析 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;从类加载、内存管理、垃圾回收、即时编译器等方面进行详细解析&#xff0c;帮助读者更好地理解JVM的内部机制。…...

Prometheus-各种exporter

文章目录 一、 nginx-prometheus-exporter1 nginx 配置1.1 Nginx 模块支持1.2 Nginx 配置文件配置2 部署 nginx-prometheus-exporter2.1 二进制方式部署2.1.1 解压部署2.1.2 配置 systemd2.1.3 添加 prometheus 的配置2.1.4 Dashborad2.2 docker-compose 方式部署3 可配置的指标…...

小程序的 weiui的使用以及引入

https://wechat-miniprogram.github.io/weui/docs/quickstart.html 网址 1.点进去&#xff0c;在app.json里面配置 在你需要的 页面的 json里面配置&#xff0c;按需引入 然后看文档&#xff0c;再在你的 wxml里面使用就好了...

git目录初始化,并拉取最新代码

现有C:\data目录&#xff0c;将目录初始化&#xff0c;并拉取代码在这里插入代码片 https://gitlab.arsbaibaodun.com/bcx_v5_app/baoan-hangyedcjg.git 1、 git init生成 .git 目录即目录初始化完成&#xff0c;可以进行拉取代码 代码成功拉取到了data目录&#xff0c;默认…...

运筹调度算法工程式招聘情况:技能要求、薪资、工作地

目录 一、前言二、岗位信息三、总结 一、前言 前一段时间&#xff0c;常看到运筹学的老师们在朋友圈转发下面的图片。今天忽然想起这件事&#xff0c;顺势查了一下“调度算法工程师”在Boss直聘上的岗位信息&#xff0c;也整理一下招聘企业所需的“调度”技能。 二、岗位信息…...

css2-BFC是什么?

1、BFC是什么&#xff1f; 在页面布局时&#xff0c;经常会出现以下几种情况&#xff1a; 这个元素高度怎末没了&#xff1f; 这两栏布局怎末没法自适应&#xff1f; 这两个元素的间距怎末有点奇怪的样子&#xff1f; … 原因就是元素之间互相影响&#xff0c;导致了意料之外的…...

Flutter Dart语言(04)库操作

0 说明 该系列教程主要是为有一定语言基础 C/C的程序员&#xff0c;快速学习一门新语言所采用的方法&#xff0c;属于在C/C基础上扩展新语言的模式。 1 自定义库 & 系统自定义库 引入代码如下所示&#xff1a; import xxx.dart; //自定义库引入&#xff0c;xxx为本…...

通向架构师的道路之漫谈使用ThreadLocal改进你的层次的划分

一、什么是ThreadLocal 早在JDK 1.2的版本中就提供java.lang.ThreadLocal&#xff0c;ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal很容易让人望文生义&#xff0c;想当然地认为是一个“本地线…...

springboot全局统一返回处理

文章目录 前言一、统一的返回格式二、全局异常处理三、全局返回处理(装逼用的)总结 前言 项目中一般都会有规定好的接口返回格式,无论成功与失败,一般格式都是不变的,这样是为了方便前后端统一处理,今天就来说下前后端统一处理的较为优雅的方式; 一、统一的返回格式 一般而言…...

C/C++面试经历(一)

目录 1. 说说你对C与C的认识&#xff1f; 2. 说说C的三大特性&#xff1f; 3. 说说C的重载&#xff1f; 4. C语言为什么不支持重载&#xff1f; 5. 说说类的默认成员函数&#xff1f; 6. 类的构造函数为什么不支持虚函数&#xff1f; 7. 说说你对指针和引用的理解&…...

【PostgreSQL】系列之 一 用户创建和授权(三)

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…...

Python连接Hive实例教程

一 Python连接hive环境实例 经在网络查询相关的教程&#xff0c;发现有好多的例子&#xff0c;发现连接底层用的的驱动基本都是pyhive和pyhs2两种第三方库的来连接的 hive,下面将简介windows 10 python 3.10 连接hive的驱动程序方式&#xff0c;开发工具&#xff1a;pycharm …...

保姆级教程:在CentOS 7上用达梦8搭建DCA练习环境(附ulimit、VNC、ODBC全配置)

达梦8 DCA认证实战&#xff1a;CentOS 7环境搭建与调优全指南 在国产数据库技术快速发展的今天&#xff0c;达梦数据库作为核心产品之一&#xff0c;其DCA认证已成为众多从业者提升竞争力的重要选择。与理论为主的认证不同&#xff0c;DCA更注重实际操作能力&#xff0c;而一个…...

[智能体-81]:工程化智能体 = 模型做脑力拆解 + 框架做流程落地。前者是决策者,后者是管理者,tools/function call是内部员工;mcp server是外部资源;

一、全角色人设 & 对应技术组件角色定位对应技术模块核心职责决策者&#xff08;脑力大脑&#xff09;大模型 LLM理解目标、任务拆解、逻辑判断、分支决策、内容生成&#xff0c;负责 “想方案、定步骤”管理者&#xff08;流程总管&#xff09;智能体编排框架&#xff08;…...

Unity UI交互进阶:手把手教你打造一个支持单击、双击、长按的万能按钮组件

Unity UI交互进阶&#xff1a;手把手教你打造一个支持单击、双击、长按的万能按钮组件在游戏开发中&#xff0c;UI交互的流畅性和多样性直接影响玩家的游戏体验。想象一下&#xff0c;当你在开发一个RPG游戏的背包系统时&#xff0c;需要实现道具的单击查看详情、双击快速使用、…...

基于PGA2311的树莓派Hi-Fi模拟音量控制器设计与实现

1. 项目概述&#xff1a;为树莓派DAC打造的高品质模拟音量控制器玩过树莓派音频播放器的朋友都知道&#xff0c;用上像PCM1794A这类高性能DAC芯片后&#xff0c;音质确实能上一个台阶&#xff0c;但有个不大不小的麻烦&#xff1a;这类芯片本身不带音量控制。软件调音量&#x…...

XZ1018,100V,40A,NMOS 封装:TO252

封装&#xff1a;TO252类型&#xff1a;NVDS&#xff1a;100V VGS&#xff1a; 20V ID&#xff1a;40ARDS(ON)&#xff1a;10V <14mΩRDS(ON)&#xff1a;4.5V <19mΩ型号&#xff1a; XZ1018 封装&#xff1a;TO252类型&#xf…...

DLA功耗优化验证:tegrastats实战指南

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

UE5项目打包后RenderTarget导出图片全黑?手把手教你解决伽马校正与资产打包问题

UE5打包后RenderTarget导出图片全黑的终极解决方案当你花了整整三天时间调试RenderTarget导出功能&#xff0c;终于在编辑器里看到完美的截图效果&#xff0c;却在打包成可执行文件后发现所有导出的图片都变成了一片漆黑——这种从云端跌入谷底的感觉&#xff0c;每个UE开发者都…...

BetterNCM安装器终极指南:5分钟解锁网易云音乐无限潜能

BetterNCM安装器终极指南&#xff1a;5分钟解锁网易云音乐无限潜能 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否觉得网易云音乐PC版功能有限&#xff0c;界面单调&#xff1f…...

UE5 Cesium项目里,如何把默认的飞行Pawn换成建筑漫游Pawn?保姆级迁移教程

UE5 Cesium项目建筑漫游Pawn迁移实战&#xff1a;从飞行模式到精细化浏览的完整指南当你在UE5中结合Cesium插件构建数字孪生场景时&#xff0c;DynamicPawn提供的全球飞行体验令人印象深刻。但当视角聚焦到单体建筑或室内空间时&#xff0c;那种仿佛操控无人机般的操作方式就显…...

为什么你的霓虹总像“塑料灯带”?Midjourney光子散射模拟缺陷曝光:3个被官方隐瞒的--sref调参禁区

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;为什么你的霓虹总像“塑料灯带”&#xff1f; 霓虹效果在现代 UI 设计中无处不在——按钮悬停、加载指示器、焦点高亮……但多数实现却流于表面&#xff1a;生硬的 box-shadow、固定色值的渐变边框、缺乏物理感…...