Java网络通信UDP

目录

网络通信基础

UDP通信

服务器

1.想要使用UDP通信 要先打开DatagramSocket文件 端口号可以手动指定或系统随机分配

2.阻塞等待接收客户端数据;创建DatagramPacket接收客户端传来的数据

3.处理客户端传来的数据,并进行业务处理(这里只演示UDP通信 所以只是回传数据)

4.处理数据成DatagramPacket并发送数据给客户端

整体代码

客户端

1.创建DatagramSocket (这里客户端端口号系统分配即可,不允许和服务器同一端口号)

2.客户端接收用户的数据

3.处理用户数据成DatagramPacket 指定要发送服务器的地址与端口号

4.发送数据给客户端

5.阻塞等待服务器响应

6.处理服务器响应的数据

7.显示数据给用户

整体代码

继承服务器代码,重写业务代码即可


网络通信基础

  1. 物理层:网络通信的基础设施                                    运快递的公路
  2. 数据链路层:两个相邻的节点之间如何传输               两个集散点之间的传输
  3. 网络层:两个点之间的路径规划                                 物流公司规划快递的路径
  4. 传输层:两个点之间的通信(不考虑路径规划)        卖家发货 只考虑起点和终点
  5. 应用层:数据传输过去之后 如何使用                         快递拿到之后如何使用

网络编程的主要工作写应用层的代码,处理应用层的协议数据

从5->1往下传输 每次传输都会依次添加报头 称为封装    QQ1发送

从1->5往上传输 每次传输都会解析去掉报头                   QQ2接收

传输层提供两种协议

TCP:有连接,可靠传输,面向字节流,全双工

UDP:无连接,不可靠传输,面向数据包,半双工

可靠传输:数据对方有没有接收到,发送方有感知;打电话就是可靠的,可以知道对方有没有听到。

不可靠传输:数据对方有没有接收到,不管,也不知道;微信就是不可靠,不知道对方有没有看到我的消息。

全双工:双向通信 可以A->B B->A 同时进行

半双工:单向通信 A->B或者B->A 同时只允许一个进行

程序要进行网络通信,需要一个端口号(客户端与服务器的端口号不能相同!)

端口号相当于用来在网络上区分进行的身份标识符

分配端口号有 1.手动指定 2.系统自动分配

UDP通信

UDP的Socket API

DatagramSocket和DatagramPaclet 核心类

socket类本质相当于文件 构造一个DatagramSock对象,相当于打开了一个内核中的socket文件

打开后就可以传输数据了

传输数据已 DatagramPacket为基本单位

InetSocketAddress类 IP地址+端口号

send发送数据 receive接收数据 close关闭数据

DatagramOacket 表示一个UDP数据报 UDP是面向数据报的协议

服务器

1.想要使用UDP通信 要先打开DatagramSocket文件 端口号可以手动指定或系统随机分配

    //想要使用UDP服务器 要打开一个文件private DatagramSocket socket=null;//创建对象//服务器IP和端口号是提供给客户端 方便客户端知道地址发送过来public Test1(int port) throws SocketException {socket=new DatagramSocket(port);//创建实例  绑定进程端口号

2.阻塞等待接收客户端数据;创建DatagramPacket接收客户端传来的数据

            DatagramPacket datagramPacket=new DatagramPacket(new byte[4096],4096);//客户端发来的请求放到参数datagramPacket  输出性参数System.out.println("我正在等待!");socket.receive(datagramPacket);//阻塞等待 客户端发起请求System.out.println("服务器接收到数据");

3.处理客户端传来的数据,并进行业务处理(这里只演示UDP通信 所以只是回传数据)

//把传来的数据构造成数据 1.获取数据 从0开始构造 构造到数据结尾String request=new String(datagramPacket.getData(),0,datagramPacket.getLength());System.out.println("接收到的数据:"+request);//处理业务String requst=process(request);System.out.println("服务器处理数据");public String process(String s){return s;}

4.处理数据成DatagramPacket并发送数据给客户端

//要传回客户端也要把数据构造成DatagramPacket//把string构造到byte字节  1.字节数据,2.字节长度 3.客户端的id+客户端的端口号DatagramPacket datagramPackets=new DatagramPacket(request.getBytes(),request.getBytes().length,datagramPacket.getSocketAddress());//发送数据socket.send(datagramPackets);System.out.println("服务器发送数据成功");System.out.printf("[地址:%s:端口号:%d] 发来数据:%s 服务器响应数据:%s\n",datagramPacket.getAddress().toString(),datagramPacket.getPort(),request,requst);

整体代码

package DemoUDP;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;//服务端
public class Test1 {//想要使用UDP服务器 要打开一个文件private DatagramSocket socket=null;//创建对象//服务器IP和端口号是提供给客户端 方便客户端知道地址发送过来public Test1(int port) throws SocketException {socket=new DatagramSocket(port);//创建实例  绑定进程端口号}public void start() throws IOException {System.out.println("启动服务器");while (true){//创建一个DatagramPacket(创建缓存区,缓存区长度)用来接收客户端发来的请求DatagramPacket datagramPacket=new DatagramPacket(new byte[4096],4096);//客户端发来的请求放到参数datagramPacket  输出性参数System.out.println("我正在等待!");socket.receive(datagramPacket);//阻塞等待 客户端发起请求System.out.println("服务器接收到数据");//把传来的数据构造成数据 1.获取数据 从0开始构造 构造到数据结尾String request=new String(datagramPacket.getData(),0,datagramPacket.getLength());System.out.println("接收到的数据:"+request);//处理业务String requst=process(request);System.out.println("服务器处理数据");//要传回客户端也要把数据构造成DatagramPacket//把string构造到byte字节  1.字节数据,2.字节长度 3.客户端的id+客户端的端口号DatagramPacket datagramPackets=new DatagramPacket(request.getBytes(),request.getBytes().length,datagramPacket.getSocketAddress());//发送数据socket.send(datagramPackets);System.out.println("服务器发送数据成功");System.out.printf("[地址:%s:端口号:%d] 发来数据:%s 服务器响应数据:%s\n",datagramPacket.getAddress().toString(),datagramPacket.getPort(),request,requst);}}public String process(String s){return s;}public static void main(String[] args) throws IOException {//端口号范围 0--65535 1024以下的端口是系统用的  尽量用1024以上 65535以下Test1 test1=new Test1(8080);test1.start();}
}

客户端

1.创建DatagramSocket (这里客户端端口号系统分配即可,不允许和服务器同一端口号)

DatagramSocket Socket=null;//客户端端口号需要系统自动分配 不能指定与服务器端口号一样,不然会抢占服务器端口号 导致后启动的一端无法启动public Test2() throws SocketException {Socket=new DatagramSocket();}

2.客户端接收用户的数据

Scanner scanner=new Scanner(System.in);System.out.println("客户端输入数据:>");String Data=scanner.nextLine();

3.处理用户数据成DatagramPacket 指定要发送服务器的地址与端口号

//处理用户数据//1.把string类型处理成byte字节数据 datagramPacket类型 里面附带发送地址和发送对方的端口号DatagramPacket datagramPacket=new DatagramPacket(Data.getBytes(),Data.getBytes().length, InetAddress.getByName("127.0.0.1"),8080);System.out.println("客户端处理数据");

4.发送数据给客户端

 //发送数据Socket.send(datagramPacket);System.out.println("客户端发送数据");

5.阻塞等待服务器响应

//阻塞等待服务器的响应数据DatagramPacket datagramPackets=new DatagramPacket(new byte[1024],1024);Socket.receive(datagramPackets);System.out.println("客户端接收服务器响应数据");

6.处理服务器响应的数据

//处理服务器响应的数据String Datas=new String(datagramPackets.getData(),0,datagramPackets.getLength());System.out.println("客户端处理数据");

7.显示数据给用户

System.out.printf("服务器响应数据:%s\n",Datas);

整体代码

package DemoUDP;import java.io.IOException;
import java.net.*;
import java.util.Scanner;//客户端
public class Test2 {DatagramSocket Socket=null;//客户端端口号需要系统自动分配 不能指定与服务器端口号一样,不然会抢占服务器端口号 导致后启动的一端无法启动public Test2() throws SocketException {Socket=new DatagramSocket();}public void start() throws IOException {while (true){//接收用户数据Scanner scanner=new Scanner(System.in);System.out.println("客户端输入数据:>");String Data=scanner.nextLine();//处理用户数据//1.把string类型处理成byte字节数据 datagramPacket类型 里面附带发送地址和发送对方的端口号DatagramPacket datagramPacket=new DatagramPacket(Data.getBytes(),Data.getBytes().length, InetAddress.getByName("127.0.0.1"),8080);System.out.println("客户端处理数据");//发送数据Socket.send(datagramPacket);System.out.println("客户端发送数据");//阻塞等待服务器的响应数据DatagramPacket datagramPackets=new DatagramPacket(new byte[1024],1024);Socket.receive(datagramPackets);System.out.println("客户端接收服务器响应数据");//处理服务器响应的数据String Datas=new String(datagramPackets.getData(),0,datagramPackets.getLength());System.out.println("客户端处理数据");//显示处理后的数据给用户System.out.printf("服务器响应数据:%s\n",Datas);}}public static void main(String[] args) throws IOException {Test2 test2=new Test2();test2.start();}
}

继承服务器代码,重写业务代码即可

package DemoUDP;import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;public class Test3 extends Test1{public Test3(int port) throws SocketException {super(port);}@Overridepublic String process(String s) {Map<String,String> dic=new HashMap<String,String>();dic.put("cat","猫");return dic.getOrDefault(s,"此单词还未更新");}public static void main(String[] args) throws IOException {Test3 test3=new Test3(8080);test3.start();}}

指定客户端多开

之后就可以同时运行多个客户端访问服务器

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

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

相关文章

MySQL 教程 2.4

MySQL UNION 操作符 本教程为大家介绍 MySQL UNION 操作符的语法和实例。 描述 MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合&#xff0c;并去除重复的行。 UNION 操作符必须由两个或多个 SELECT 语句组成&#xff0c;每个 SELECT 语句的列数…

Python降维数据库之umap使用详解

概要 在数据科学和机器学习领域,数据通常是高维度的,而高维度数据不仅难以可视化,还会增加建模的复杂性。降维是一种处理高维数据的关键技术,而Python UMAP(Uniform Manifold Approximation and Projection)是一种强大的降维工具,它在保留数据结构的同时,将高维数据映…

【IDEA+通义灵码插件】实现属于你的大模型编程助手

目录 1.前言 2.下载安装 3.解释代码 4.生成单元测试 5.生成注释 6.智能补全 1.前言 大模型到底该以一种什么方式落地&#xff0c;从而嵌入我们的工作当中&#xff0c;助力我们工作效率的提升&#xff0c;其实最好的方式也许就是虚拟助手的方式&#xff0c;就像钢铁侠的&…

【OpenCV基础(三)】Ubuntu系统下EasyPR环境配置

环境配置 1、资源下载2、环境配置2.1、1、将EasyPR压缩包拷贝到Ubuntu 三种方法任选一种2.2、解压得到EasyPR文件夹(文件夹一层进入后EasyPR资源内容)2.3、终端命令修改权限**chmod -R 777 ./ EasyPR**2.4、查找EasyPR/include/easypr/config.h&#xff0c;使用gedit方式打开2.…

vue2本地开发环境正常,生产环境下this.$router.push({ name: ‘login‘ })不跳转

如果在Vue.js 2中在本地开发环境下正常运行,但在生产环境下使用​​this.$router.push({ name: login })​​不起作用,可能有几个原因需要检查和解决: 路由配置问题: 确保你的路由配置正确,特别是确保在生产环境中,路由的配置和本地开发环境一致。检查是否正确设置了name…

基于springboot+vue的智能学习平台系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

SAP PP学习笔记 - 豆知识07 - 如何查看BOM一览

SAP标准提供了CS03&#xff0c;只能查询单个的BOM&#xff0c;如果想查看一览&#xff0c;只能自己写SQVI 查询。 有其他高招的童鞋&#xff0c;请赐教啊。 1&#xff0c;SQVI 工具 SAP MM学习笔记18- SQVI 工具_sap sqvi-CSDN博客 输入查询名&#xff0c;然后点击 登录 2&a…

#QT(DEMO2-登录界面)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;DEMO登录 3.记录 Line Edit输入不换行 密码框输入如下设置: 运行效果 4.代码

Vue.js+SpringBoot开发在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

五、西瓜书——集成学习

1.个体与集成 集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能&#xff0c;这对“弱学习器”(weak learner)尤为明显因此集成学习的很多理论研究都是针对弱学习器进行的而基学习器有时也被直接称为弱学习器。 要获得好的集成个体学习器应“好而不同”…

武汉灰京文化:多样化推广与创新引领游戏行业

作为专业的游戏推广服务商&#xff0c;武汉灰京文化注重多样化的推广策略&#xff0c;通过与各大媒体、社交平台和游戏社区建立紧密的合作关系&#xff0c;为游戏企业提供全方位的推广服务。他们通过精确的广告投放、内容创作和社交媒体互动等方式&#xff0c;将游戏信息传播给…

【C++】STL学习之旅——初识STL,认识string类

string类 1 STL 简介2 STL怎么学习3 STL缺陷4 string4.1 初识 string4.2 初步使用构造函数成员函数 5 小试牛刀Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 STL 简介 …

解读OWASP软件保障成熟度模型SAMM

OWASP软件保证成熟度模型&#xff08;SAMM&#xff09;可为所有类型的组织分析和改进其软件安全态势提供有效和可衡量的方法。OWASP SAMM支持完整的软件生命周期&#xff0c;包括开发和获取&#xff0c;并且与技术和过程无关。 1. 简介 OWASP软件保证成熟度模型&#xff08;SA…

数据结构 第3章 栈、队列和数组(一轮习题总结)

第3章 栈、队列和数组 3.1 栈3.2 队列3.3 栈与队列的应用3.4 数组和特殊矩阵 3.1 栈&#xff08;1 10 11 20&#xff09; 3.2 队列&#xff08;6 12 14 17&#xff09; 3.3 栈与队列的应用&#xff08;6 11&#xff09; 3.4 数组和特殊矩阵 3.1 栈 T1 栈和队列具有相同的逻辑…

k8s-prometheus监控部署 22

新建项目仓库并上传部署prometheus所需的镜像 开始部署 修改svc访问方式为LoadBalancer 查看用户名和密码 访问grafana监控页面 http://192.168.182.103/​​​​​​ 修改可视化模板 官方监控模板&#xff1a;https://grafana.com/grafana/dashboards 访问prometheus监控页面…

1. vue3-环境准备

1、安装node.js 如果开发环境上面没有安装node.js&#xff0c;需要到node.js官方网站下载node.js。下载安装后&#xff0c;可以通过npm --version查看nodejs版本 2. 开发工具 开发工具建议使用vscode

知识图谱1——neo4j

2024年要搞知识图谱&#xff0c;因此没有办法&#xff0c;只能将我之前固守的JDK1.8&#xff0c;升级到JDK21&#xff0c;因为JDK21也是LTS版本&#xff0c;neo4j高版本就不支持JDK8&#xff0c;因此没有办法&#xff0c;只有升级了。写这篇只是一个搭建笔记&#xff0c;我的初…

AJAX 学习笔记(Day3)

「写在前面」 本文为黑马程序员 AJAX 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. AJAX 学习笔记&#xff08;Day1&#xff09; 目录 3 AJAX 原理 3.1 XMLHttpRequest 3…

springboot心灵治愈交流平台源码和论文

本论文主要论述了如何使用JAVA语言开发一个心灵治愈交流平台 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述心灵治愈交流平台的当前背景以及系统开发的目的&a…

@Transactional--开启事物后换源报错

一、问题出现的场景 系统架构设计、每个企业一个企业库、通过数据源切在平台库、和企业库之间动态切换完成业务操作。 二、跨库事物失效的原因 1、SpringTransactional不支持跨数据源事物&#xff0c;Spring 事物控制是基于数据库链接进行的&#xff0c;当数据源切换后&#x…