javaEE-网络编程-3 UDP

目录

Socaket套接字 

UDP数据报套字节编程

1.DatagrameSocket类

DatagramSocaket构造方法:

DatagramSocaket常用方法:

2.DatagramPacket类

DatagramPacket构造方法:

UDP回显服务器实现

UDP服务端实现:

创建一个Socket类对象:

构造方法:

创建start()方法:

异常:

代码展示:

UDP客户端实现:

创建一个Socket对象:

构造方法:

start()方法:

​编辑 代码展示:

 结果:

服务端和客户端之间的执行流程:


Socaket套接字 

Socaket套接字是系统提供的,用于网络通信的技术。是基于TCP/IP协议的网络通信的基本单位。

基于Socaket套接字的网络程序开发就是网络编程。

简单来说,Socket就是操作系统中的一个概念,本质上是一种特殊的文件。

Socaket就是把“网卡”这样的概念给抽象成了文件,把网络通信和文件操作给统一了:

往Socket中写数据,就相当于通过网卡发送数据;从Socket中读数据,就相当于通过网卡接收数据。

Socaket套接字注意事项:

1. 客⼾端和服务端:开发时,经常是基于⼀个主机开启两个进程作为客⼾端和服务端,但真实的场 景,⼀般都是不同主机。

2. 注意 ⽬的IP 和 ⽬的端⼝号,标识了⼀次数据传输时要发送数据的终点主机和进程。

 3. Socket编程我们是使⽤  流套接字 和 数据报套接字,基于传输层的TCP或UDP协议,但应⽤层协议, 也需要考虑,这块我们在后续来说明如何设计应⽤层协议。

4. 关于端⼝被占⽤的问题

5. 如果⼀个进程A已经绑定了⼀个端⼝,再启动⼀个进程B绑定该端⼝,就会报错,这种情况也叫端⼝ 被占⽤

UDP数据报套字节编程

对于UDP来说,是无连接,面向数据报的特点。即每次都没有建立连接,并且一次发送全部的数据报,一次也接受全部的数据报。

UDP的socktet的api是如何实现的?

java中是由UDP协议通信,主要是使用DatagramSocket类来创建数据报套接字Socket。用DatapramPacket类来作为发送和接收数据报。

1.DatagrameSocket类

java中就是用DatagrameSocket 类来表示UDP Socket文件,用于接收和发送UDP数据报.

DatagramSocaket构造方法:

DatagramSocaket常用方法:

receive和send方法的 DatagramPacket 参数属于 “输出型参数”。

2.DatagramPacket类

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

使用这个类来表示UDP数据报,每次传输数据都要以UDP数据报为单位。

DatagramPacket构造方法:

DatagramPacket常用方法:

创建UDP发送数据DatagramPacket responseSocket时,需要指定发送的对方IP和端口号,要传入SocketAddress参数:目的主机的IP地址和端口号,该对象可以使用InteSocketAddress类来创建。

InteSocketAddress类

构造方法:

UDP回显服务器实现

写一个简单的UDP 服务器/客户端通信的程序 :回显服务器(Echo Server)

这个程序没有实现什么功能,就是调用Socket api,让客户端给服务器发送一个请求,请求就是从控制台输入的字符串,服务器再将这个字符串返回给客户端,客户端再将字符串打印显示出来。

DatagramSocket,DatagramPacket类都是再java.net包中的·:

服务器和客户端要创建一个Socket对象,服务器的Socket要显示指定一个端口号,而客户端Socket不需要显示指定(系统会自动分配一个随机端口号)

原因:

UDP服务端实现:

创建一个Socket类对象:

构造方法:

显示指定一个端口号

创建start()方法:

完成Socket的 接收客户端请求,做出响应 返回响应的功能,并循环执行

任务1.创建一个DatagramPacket类对象,接收用户的请求,调用receive方法

requestPacket:

任务2:根据请求 计算响应

任务3:将响应返回给客户端

responsePacket:

这里的第三个参数response.getBytes().length.不能写成response.length():

异常:

在这个程序中,会经常看到SockerException和IOException,要处理一下:

start()代码:

代码展示:

UdpEchoServer

/*** 实现UDP 回显服务器*/class UdpEchoServer{//创建DatagramSocket类,进行发送数据和接收数据private DatagramSocket socket=null;//UDP服务端 构造方法 serverPock: 指定端口号public UdpEchoServer(int serverPort) throws SocketException {socket=new DatagramSocket(serverPort);}//start方法中,完成Socket的 接收客户端请求,做出响应 返回响应的功能public void start() throws IOException {System.out.println("服务器启动");while(true){//每次循环 ,就是处理一个请求-响应的过程//1.创建一个DatagramPacket类空对象,用来接收用户的请求DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);//通过receive接收用户的请求//此处可能会出现阻塞-》等待用户发送请求socket.receive(requestPacket);//2.根据请求 计算响应//先将请求转换成字符串 方便后面的操作String request=new String(requestPacket.getData(),0,requestPacket.getLength());//计算响应String response=process(request);//3.将响应返回给客户端//先将响应打包成DatagramPacket, 指定数据内容、长度、要发给哪个客户端DatagramPacket responsePacket=new DatagramPacket(response.getBytes(), 0,response.getBytes().length,requestPacket.getSocketAddress());//将响应返回给客户端socket.send(responsePacket);//打印用户IP 端口号,请求信息 响应信息System.out.printf("[%s,%d],req:%s,resp:%s\n",requestPacket.getAddress(),requestPacket.getPort(),request,response);}}public String process(String request) {//这里什么也不做,就将用户的请求返回return request;}//测试public static void main(String[] args) throws IOException {UdpEchoServer udpEchoServer = new UdpEchoServer(9090);udpEchoServer.start();}
}

UDP客户端实现:

创建一个Socket对象:

构造方法:

start()方法:

 代码展示:


/*** 实现UDP 回显服务器* 客户端*/class UdpEchoClient1{private DatagramSocket socket=null;private String serverIP;//服务端IPprivate int serverPort;//服务端 端口号//构造方法 传入服务端的Ip 端口号 并保存public UdpEchoClient1(String serverIp,int serverPort) throws SocketException {socket=new DatagramSocket();this.serverIP=serverIp;this.serverPort=serverPort;}public void start() throws IOException {System.out.println("客户端启动");Scanner scan=new Scanner(System.in);while(true){System.out.print("->");//1.用户从控制台输入请求if(!scan.hasNext()){break;}//2.读取请求String request=scan.next();//3.将请求发送给服务器//先将请求打包成requestPacket , 指定内容,长度 ;指定要发送的服务器IP,端口号DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIP),serverPort);//发送请求 给服务器socket.send(requestPacket);//4.接收服务器的响应//先创建一个空的DatagramPacket,用来接收服务器的响应DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);//接收服务器响应socket.receive(responsePacket);//将响应转换成String 打印在控制台String response=new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient1 udpEchoClient1 = new UdpEchoClient1("127.0.0.1", 9090);udpEchoClient1.start();}
}

 结果:

客户端和服务端同时启动

DatagramPacket对象,共出现了三种形式:

1.创建空对象,用来存放请求的  参数:字节数组 数组长度

2.服务器 存放请求的响应结果  参数:  响应字节数组  数组长度  客户端IP和端口号

3.客户端 向服务端发送请求  参数:  请求字节数组  数组长度  服务端IP  服务端端口号

服务端和客户端之间的执行流程:

通过UDP服务端模拟实现一个"翻译词典":

参考代码:


/*** 实现一个词典翻译服务器* 英 译 汉*/
class UdpDirectServer extends UdpEchoServer{//翻译服务器,连接功能与初始的服务器一样,通过继承UdpEchoServer类,// 重写process方法,实现特有功能//创建一个哈希表,通过键值对来实现一个查找的功能private HashMap<String,String> hashMap=new HashMap<>();public UdpDirectServer(int serverPort) throws SocketException {super(serverPort);//填充哈希表hashMap.put("cat","小猫");hashMap.put("dog","小狗");hashMap.put("pig","小猪");hashMap.put("flag","小鸟");//......//真实的翻译词典也是通过大量的键值对来实现查找功能的}//重写父类的process方法,实现"翻译"功能@Overridepublic String process(String request) {return hashMap.get(request);}public static void main(String[] args) throws IOException {UdpDirectServer udpDirectServer = new UdpDirectServer(9090);udpDirectServer.start();}}

参考结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502531.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vim Masterclass 笔记08】第 6 章:Vim 中的文本变换及替换操作 + S06L20:文本的插入、变更、替换,以及合并操作

文章目录 Section 6&#xff1a;Transforming and Substituting TextS06L21 Inserting, Changing, Replacing, and Joining1 定位到行首非空字符&#xff0c;并启用插入模式2 在紧挨光标的下一个字符位置启动插入模式3 定位到一行末尾&#xff0c;并启用插入模式4 定位到光标的…

Transformer知识梳理

Transformer知识梳理 文章目录 Transformer知识梳理什么是Transformer&#xff1f;语言模型迁移学习 Transformer结构注意力层原始结构 总结 什么是Transformer&#xff1f; 语言模型 Transformer模型本质上都是预训练语言模型&#xff0c;大部分采用自监督学习&#xff08;S…

小程序学习06——uniapp组件常规引入和easycom引入语法

目录 一 组件注册 1.1 组件全局注册 1.2 组件全局引入 1.3 组件局部引入 页面引入组件方式 1.3.1 传统vue规范&#xff1a; 1.3.2 通过uni-app的easycom 二 组件的类型 2.1 基础组件列表 一 组件注册 1.1 组件全局注册 &#xff08;a&#xff09;新建compoents文件…

数据插入操作的深度分析:INSERT 语句使用及实践

title: 数据插入操作的深度分析:INSERT 语句使用及实践 date: 2025/1/5 updated: 2025/1/5 author: cmdragon excerpt: 在数据库管理系统中,数据插入(INSERT)操作是数据持久化的基础,也是应用程序与用户交互的核心功能之一。它不仅影响数据的完整性与一致性,还在数据建…

并发服务器框架——zinx

zinx框架 Zinx 是一个用 Go 语言编写的高性能、轻量级的 TCP 服务器框架&#xff0c;它被设计为简单、快速且易于使用。Zinx 提供了一系列的功能&#xff0c;包括但不限于连接管理、数据编解码、业务处理、负载均衡等&#xff0c;适用于构建各种 TCP 网络服务&#xff0c;如游戏…

科研绘图系列:R语言科研绘图之标记热图(heatmap)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图系统信息参考介绍 科研绘图系列:R语言科研绘图之标记热图(heatmap) 加载R包 library(tidyverse) library(ggplot2) library(reshape)…

物体切割效果

1、物体切割效果是什么 在游戏开发中&#xff0c;物体切割效果就是物体看似被切割、分割或隐藏一部分的视觉效果。 这种效果常用与游戏和动画中&#xff0c;比如角色攻击时的切割效果&#xff0c;场景中的墙壁切割效果等等。 2、物体切割效果的基本原理 在片元着色器中判断片…

Prism模块化

1.先假设ModuleA是需要被模块化的&#xff0c;里面随便写了个用户控件 2.需要用这个模块就给添加一下它的引用 3.使用这个模块的时候就在App.xaml.cs中添加这个模块&#xff0c;通过重写方法ConfigureModuleCatalog实现 protected override void ConfigureModuleCatalog(IModu…

vue3+Echarts+ts实现甘特图

项目场景&#xff1a; vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…

【FlutterDart】 拖动边界线改变列宽并且有边界高亮和鼠标效果(12 /100)

【Flutter&Dart】 拖动改变 widget 的窗口尺寸大小GestureDetector&#xff5e;简单实现&#xff08;10 /100&#xff09; 【Flutter&Dart】 拖动边界线改变列宽类似 vscode 那种拖动改变编辑框窗口大小&#xff08;11 /100&#xff09; 上效果 对比一下vscode的效果&…

umd格式

umd格式是啥&#xff1f; umd格式是一种通用模块&#xff0c;他同时支持AMD、CJS、ESM模块和全局变量的方式 umd格式打包后的基本代码结构如下: (function (root, factory) {if (typeof define function && define.amd) {// AMDdefine([dependency], factory);} el…

《Rust权威指南》学习笔记(二)

枚举enum 1.枚举的定义和使用如下图所示&#xff1a; 定义时还可以给枚举的成员指定数据类型&#xff0c;例如&#xff1a;enum IpAddr{V4(u8, u8, u8, u8),V6(String),}。枚举的变体都位于标识符的命名空间下&#xff0c;使用::进行分隔。 2.一个特殊的枚举Option&#xff0…

CoppeliaSim和Python进行无人机联合仿真

首先建立起CoppeliaSim和Python的连接,其次在Python中生成轨迹,CoppeliaSim仿真环境中的无人机进行跟踪,并绘制出轨迹曲线,有每一步详细的教学。 最终运行效果: 一、 建立起CoppeliaSim和Python的远程连接 1. 拷贝API函数和库文件 拷贝库函数文件 sim.py、simConst.p…

「Java 数据结构全面解读」:从基础到进阶的实战指南

「Java 数据结构全面解读」&#xff1a;从基础到进阶的实战指南 数据结构是程序设计中的核心部分&#xff0c;用于组织和管理数据。Java 提供了丰富的集合框架和工具类&#xff0c;涵盖了常见的数据结构如数组、链表、栈、队列和树等。本文将系统性地介绍这些数据结构的概念、…

windows11安装minikube

主要是按照官网步骤安装&#xff0c;由于是英文&#xff0c;又不是常规安装包的形式&#xff0c;稍微难理解一点&#xff0c;特此记录。 下文仅是对部分步骤做了说明&#xff0c;需要以官网为主&#xff0c;本文为辅。 一、访问minikube官网 https://minikube.sigs.k8s.io/d…

LLM大模型RAG内容安全合规检查

1.了解内容安全合规涉及的范围 我们先回顾一下智能答疑机器人的问答流程。问答流程主要包括用户、智能答疑机器人、知识库、大语言模型这四个主体。 涉及内容安全的关键阶段主要有&#xff1a; 输入阶段&#xff1a;用户发起提问。 输出阶段&#xff1a;机器人返回回答。 知识…

OpenCV计算机视觉 05 图像边缘检测(Sobel算子、Scharr算子、Laplacian算子、Canny边缘检测)

图像边缘检测 边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具&#xff0c;通常用于特征提取和特征检测&#xff0c;旨在检测一张数字图像中有明显变化的边缘或者不连续的区域。 yuancv2.imread(yuan.png) cv2.imshow(yuan,yuan) cv2.waitKey(0) yuan_xcv2.Sob…

【C++】P2550 [AHOI2001] 彩票摇奖

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a; &#x1f4af;题解思路1. 问题解析 &#x1f4af;我的实现实现逻辑问题分析 &#x1f4af;老…

【调试记录】在CARLA中插入可以播放视频的组件

〇、问题描述 做实验验证的时候&#xff0c;需要在CARLA仿真环境中添加一个可以播放视频的功能&#xff0c;查了很多现有的实验&#xff0c;基本都是插入图像&#xff0c;而对于插入视频&#xff0c;实现的方法就很麻烦了。一开始考虑的是直接用射影变换进行叠加&#xff0c;计…