【网络编程】UDP实现回显服务器

一.网络编程的基本术语.

  • 客户端

客户端是为用户提供本地服务的程序,通常位于用户设备上。也称为用户端,是相对于服务器而言的。它主要指安装在用户设备上的程序,这些程序能够与服务器进行通信,从而获取服务或者执行特定功能。在互联网应用中,常见的客户端包括网页浏览器、电子邮件客户端和即时通讯软件等。它们需要与远端的服务器建立连接,以便接收如数据库服务、邮件服务等网络服务。

  • 服务器

服务器则是为其他程序或设备提供功能的计算机或软件。一种专门设计用来处理数据请求并提供服务的计算设备。它具备高速的CPU、大容量的存储空间以及强大的I/O吞吐能力,能够长时间稳定运行。服务器的主要作用是在网络中为客户机(如个人电脑、智能手机等)提供诸如网站访问、文件存储、数据处理等各种计算和应用服务。

  • 网络编程

网络编程 : 指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。

  • 套接字(Socket)

套接字,常称为socket,是计算机网络中用于实现不同主机之间的进程双向通信的端点。在网络编程中,套接字充当了非常重要的角色,它定义了一套标准的API,允许程序员在不同的计算机之间发送和接收数据.是网络编程中实现不同主机间进程通信的一种技术规范和编程接口。

  • 流套字节

使用传输层TCP协议 , 对于字节流来说,可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。

  • 数据报套接字

使用传输层UDP协议 , 对于数据报来说,可以简单的理解为,传输数据是⼀块⼀块的,发送⼀块数据假如100个字节,必须⼀次发送,接收也必须⼀次接收100个字节,而不能分100次,每次接收1个字节。

  • 原始套字节

原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。

  • TCP和UDP的特点

TCP特点:

  1. 有连接 : 连接的双方都需要认同(本质上就是通信双方都保存有通信双方各自的信息)
  2. 可靠传输 : 主要是指发送方放的信息是否被收到 , 发送方能够清楚的感知到.
  3. 面向字节流 : 传输的基本单位是以字节为基本单位
  4. 全双工 : 一个信道,可以双向通信. 只能单向通信就称为’‘半双工’’

UDP的特点:
1.无连接. 2. 不可靠传输. 3.面向字节报 4.全双工.

二.常用API

DatagramSocket
构造方法:
在这里插入图片描述
常用方法:
在这里插入图片描述
DatagramPacket
构造方法:
在这里插入图片描述
基本方法:
在这里插入图片描述

三.基于UDP回显服务器.

客户端代码

package Demo1;import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;public class udpEchoClint {private DatagramSocket datagramSocket = null;private String  serverIP;private int serverPort;//客户端要给服务器发送请求的前提就是知道服务器的地址public udpEchoClint(String serverIP,int serverPort) throws SocketException {datagramSocket = new DatagramSocket();this.serverIP= serverIP;this.serverPort = serverPort;}public void start() throws IOException {System.out.println("客户端启动~~");Scanner scanner = new Scanner(System.in);while(true){System.out.print("->");if(!scanner.hasNext()){break;}//1.从控制台读取要发送的请求数据.String request = scanner.next();//2.构造一个请求并发送.DatagramPacket requestPacket = new DatagramPacket(request.getBytes(StandardCharsets.UTF_8),request.getBytes().length,InetAddress.getByName(serverIP),serverPort);datagramSocket.send(requestPacket);//3.读取服务器的响应.DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);datagramSocket.receive(responsePacket);//4.把响应显示到控制台上String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {udpEchoClint clint = new udpEchoClint("127.0.0.1",9090);clint.start();}
}

服务器代码

package Demo1;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;public class udpEchoServer {private DatagramSocket datagramSocket = null;public udpEchoServer(int port) throws SocketException {datagramSocket = new DatagramSocket(port);}//服务器的启动逻辑.public void start() throws IOException {System.out.println("服务器启动!!");//对于服务器来说,需要不停的收到请求,返回响应while(true){//每次循环就是处理一个请求返回响应的过程//1.读取请求并解析DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);//这个字节数组,保存收到的消息正文(应用层数据包),也就是应用层数据报的载荷部分datagramSocket.receive(requestPacket);//将消息正文转化为字符串.String request = new String(requestPacket.getData(),0,requestPacket.getLength());//2.根据请求计算响应(对于回显服务器来说,这一步啥也不用干)String response = process(request);//3.把响应返回给客户端//构造一个响应对象.DatagramPacket responsePacket = new DatagramPacket(response.getBytes(StandardCharsets.UTF_8),response.getBytes().length,requestPacket.getSocketAddress() //得到一个INetAddress对象吗,里面存储了客户端的IP和端口号.// 会把客户端的源IP和端口号,作为目的IP和目的端口号.);datagramSocket.send(responsePacket);//打印日志:System.out.printf("[%s,%d],request: %s, response: %s",responsePacket.getAddress().toString(),responsePacket.getPort(),request,response);}}public String process(String request){//回显服务器,返回要求.return request;}public static void main(String[] args) throws IOException {udpEchoServer server = new udpEchoServer(9090);//1024<端口号范围<65535server.start();}
}

运行结果:
在这里插入图片描述
在这里插入图片描述
具体的执行流程:

  1. 服务器启动===>启动之后,立即进入while循环,执行到receive,进入阻塞,此时客户端还没有发来请求~~
  2. 客户端启动===>启动之后,立即进入while虚幻,执行到hasNext这里~~进入阻塞,此时用户没有在控制台输入任何内容.
  3. 用户在客户端的控制台中输入字符串,按下回车.此时hasNext阻塞解除,next会返回刚才输入的内容.
    基于用户输入的内容,构造出一个DatagramPacket对象,并进行send~~
    send执行完毕之后,继续执行到receive操作,等待服务器返回的响应数据(此时服务器还没有返回响应,这里也会阻塞).
  4. 服务器收到请求之后,就会从receive的阻塞中返回.
    返回之后,就会根据读到的DatagramPacket对象,构造String request,通过process方法构造一个String response
    再根据response构造一个DatagramPacket表示响应对象,再通过send来进行发送给客户端
    执行这个过程中,客户端也始终在阻塞等待!!
  5. 客户端从receive中返回执行,就能够得到服务器返回的相应.并且打印在控制台上.
    于此同时,服务器进入下一次循环,也要进入到第二次的receive阻塞,等待下个请求~~

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

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

相关文章

Spark安装教程

Spark安装教程 文章目录 Spark安装教程1. 检查jdk版本2. 获取Spark版本安装资源3.环境变量4.配置文件5. 重启Hadoop集群(使配置生效)6. 启动Spark集群6.1 查看Spark服务6.2 访问Spark WEB UI 7. 启动 Spark-Shell 测试 Scala 交互式环境8. 测试Spark On Yarn9.关闭Spark集群 1.…

OpenHarmony实战开发-Grid和List内拖拽交换子组件位置。

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

java面向对象.day23(多态)

一些基础介绍&#xff1a; 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。 一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多&#xff08;一般是父类或有关系的类&#xff09; 多态存在的条件 有继承关系 子类重写父类方法 父类引用…

Hbase 伪分布式安装 - UbuntuServer2204

Hbase 伪分布式安装 - UbuntuServer2204 安装伪分布Hadoop 安装 zookeeper mkdir /export/data/zookeeper/data -p mkdir /export/data/zookeeper/log -pcd /export/softpackages/ tar -xvf apache-zookeeper-3.8.4-bin.tar.gzmv apache-zookeeper-3.8.4-bin /export/server…

STM32-ADC(独立模式、双重模式)

ADC简介 18个通道&#xff1a;外部信号源就是16个GPIO回。在引脚上直接接模拟信号就行了&#xff0c;不需要侄何额外的电路。引脚就直接能测电压。2个内部信号源是内部温度传感器和内部参考电压。 逐次逼近型ADC: 它是一个独立的8位逐次逼近型ADC芯片&#xff0c;这个ADC0809是…

性能测试 Jmeter 非 GUI 模式 -CLI 命令详解

我们在使用Jmeter做性能测试的时候&#xff0c;大部分同学用的是图形化界面进行脚本编写和执行性能测试的。但是其实真正在公司执行性能测试的时候&#xff0c;我们基本上不会用图形化界面去执行测试&#xff0c;这是因为工具渲染这些图形本身会让Jmeter结果存在很多不稳定的因…

FMEA赋能可穿戴设备:打造安全可靠的未来科技新宠!

在科技日新月异的今天&#xff0c;可穿戴设备已成为我们生活中不可或缺的一部分。它们以其便携性、智能化和个性化的特点&#xff0c;深受消费者喜爱。然而&#xff0c;随着可穿戴设备市场的快速扩张&#xff0c;其安全性和可靠性问题也日益凸显。为了确保产品质量&#xff0c;…

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题

旧版本模式&#xff1a; # 以下inputTag任选其一&#xff0c;其他注释掉 inputTag driver.find_element_by_id("value") # 利用ID查找inputTags driver.find_element_by_class_name("value") # 利用类名查找inputTag driver.find_element_by_name(&q…

微信小程序全局配置

全局配置文件及常用的配置项 小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下&#xff1a; ① pages 记录当前小程序所有页面的存放路径 ② window 全局设置小程序窗口的外观 ③ tabBar 设置小程序底部的 tabBar 效果 ④ style 是否启用新版的组件样…

java实现根据sql动态下载数据到excel

需求 由于生产数据库不能直接连接下载数据&#xff0c;所以需要在监控系统上做一个根据sql动态查询并下载数据的功能。 实现思路 写一个接口&#xff0c;传入需要查询的数据库信息和sql&#xff0c;将查询的接口导出到Excel中 实现细节 入参 Data public class ExportDat…

递推算法4(c++)

判断整除 题目描述 一个给定的正整数序列&#xff0c;在每个数之前都插入号或−号后计算它们的和。比如序列&#xff1a;1、2、4共有8种可能的序列&#xff1a; (1) (2) (4) 7 (1) (2) (-4) -1 (1) (-2) (4) 3 (1) (-2) (-4) -5 (-1) (2) (4) 5 (-1) (2…

Mint Ubuntu 使用 docker compose 创建容器

1.安装 docker docker-compose sudo apt install docker.io sudo apt-get install docker-compose sudo usermod -aG docker $USER sudo systemctl daemon-reload sudo systemctl restart docker 2.配置国内 docker 镜像源 修改/etc/docker/daemon.json&#xff0c;增加或者…

图灵奖2023:Avi Wigderson的开创性贡献揭示计算中的随机性和伪随机性

文章目录 每日一句正能量前言背景什么是理论计算机科学&#xff1f;为什么随机性很重要&#xff1f;三篇影响深远的论文Avi Wigderson在计算复杂性理论方面的贡献及其对现代计算的影响Avi Wigderson对随机性和伪随机性在计算中作用的理解及其实际应用Avi Wigderson的学术生涯和…

Spring、SpringMVC、SpringBoot核心知识点(持续更新中)

Spring、SpringMVC、SpringBoot核心知识点&#xff08;持续更新中&#xff09; Spring Bean 的生命周期Spring 的 IOC 与 AOPSpring Bean 循环依赖Spring MVC 处理请求的过程Spring Boot 自动装配原理Spring Boot 启动流程 Spring Bean 的生命周期 参考文章&#xff1a;一文读…

HBase的数据模型与架构

官方文档&#xff1a;Apache HBase – Apache HBase™ Homehttps://hbase.apache.org/ 一、HBase概述 1.概述 HBase的技术源自Google的BigTable论文&#xff0c;HBase建立在Hadoop之上&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;用于…

mac上 Sublime Text 无法使用 Package Control

我也不知道什么时候用不了的&#xff0c;平时就是用来看看文本文件&#xff0c;因为觉得这个玩意真的很快 今天想安装一个包&#xff0c;发现 cmd shift P 是出来那个窗口了&#xff0c;但是输入什么都没反应&#xff0c;于是在 github 上找到了解决方案 打开终端执行以下命…

发作性睡病患者应该注意哪些生活调整?

发作性睡病是一种慢性睡眠障碍&#xff0c;患者常常在白天出现不可控制的睡意&#xff0c;甚至突然入睡。这种病症不仅影响患者的日常生活和工作&#xff0c;还可能带来安全隐患。因此&#xff0c;发作性睡病患者需要注意以下生活调整&#xff0c;以改善生活质量并减少潜在风险…

vivado 在硬件管理器中调试 AXI 接口

在硬件管理器中调试 AXI 接口 IP integrator 中的 System ILA IP 支持您在 FPGA 上对设计执行系统内调试。在 Versal 器件上 &#xff0c; System ILA 核已被废 弃。现在 &#xff0c; 在含 AXIS 接口的标准 ILA 中支持接口调试。如需监控 IP integrator 块设计中的…

安达发|体育产业体育装备生产车间APS排产软件

在体育产业中&#xff0c;体育装备的生产是保障运动员成绩和安全的关键一环。随着市场需求的多样化和个性化&#xff0c;传统的生产排程方法已经难以满足现代体育装备生产的复杂性和灵活性。因此&#xff0c;应用高级排产软件&#xff08;APS&#xff09;进行生产计划和控制成为…

微服务中Dubbo通俗易懂讲解及代码实现

当你在微服务架构中需要不同服务之间进行远程通信时&#xff0c;Dubbo是一个优秀的选择。Dubbo是一个高性能的Java RPC框架&#xff0c;它提供了服务注册、发现、调用、负载均衡等功能&#xff0c;使得微服务之间的通信变得简单而高效。 让我们来看一下Dubbo的通俗易懂的解释和…