详解UDP协议与实现UDP版本字典翻译客户端与服务器

news2024/9/24 4:20:22

文章目录

  • 前言
  • 1. UDP协议介绍
  • 2.UDP Socket的介绍
  • 3. UDP版本字典翻译服务器
  • 4. UDP版本字典翻译客户端

前言

UDP协议也是传输层的一种协议,上篇文章我们介绍了TCP协议可以参考我的另一篇博客详解TCP协议以及实现TCP版本的字典翻译服务器客户端,以下来介绍一下UDP协议以及他的使用。

1. UDP协议介绍

  1. UDP协议是无连接,不可靠传输,面向数据报。全双工的协议。

    解释说明:

    1. 无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接;
    2. 不可靠:发送端发送数据报后就算没有接收UDP协议层也不会返回错误信息给应用层;
    3. 面向数据报:应用层交给UDP多长的报文,就发送多长,既不会拆分也不会合并;
    4. 缓冲区:UDP只有接收缓冲区没有发送缓冲区,发送的数据直接交给内核,由内核交给网络层然后继续后续的传输;UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃;
  2. UDP协议端格式:
    在这里插入图片描述

  3. UDP与TCP协议的比较:

    1. TCP具有可靠性UDP没有,但是UDP传输速度比TCP快。
    2. 使用场景:TCP用于可靠传输的情况,应用于文件传输,重要状态更新等场景;UDP用于对高速传输和实时性要求较高的通信领域,例如,早期的QQ,视频传输等。另外UDP可以用于广播;

2.UDP Socket的介绍

Java中分装的UDP版本API主要分为DatagramSocketDatagramPacket 用于发送和接收UDP数据报。

DatagramSocket:

  1. DatagramSocket的构造方法:
    1. DatagramSocket() :创建一个UDP数据报套接字的Socket,绑定到本机的任意一个随机端口(一般用于客户端)。
    2. DatagramSocket(int port) :创建一个UDP数据报套接字的Socket,绑定到本机的指定端口(一般用于服务器)。
  2. DatagramSocket的方法:
    1. void receive(DatagramPacket p):从此套接字接收数据报,如果没有接收到数据报就会阻塞等待。
    2. void send(DatagramPacket p):从此套接字发送数据报包。
    3. void close():关闭数据报套接字。

DatagramPacket:

  1. DatagramPacket的构造方法:

    1. DatagramPacket(byte[] buf ,int length) :构造一个DatagramPacket 用来接收数据报,接收的数据保存在字节数组中,接收指定长度length。
    2. DatagramPacket(byte[] buf, int offest, int length, SocketAddress address) :构造一个DatagramPacket 用来发送数据报,发送的数据为字节
      数组中,从offest到指定长度length位置。address指定目的主机的IP和端口号。
  2. DatagramPacket的方法:
    1. InetAddress getAddress():从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取
    接收端主机IP地址。
    2. int getPort():从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号。
    3. byte[] getData():获取数据报数据。

InetSocketAddress
用DatagramPacket 构造UDP发送的数据报时,需要传入SocketAddress,该对象可以使用InetSocketAddress类创建。

InetSocketAddres的构造方法:

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

3. UDP版本字典翻译服务器

注意: 以下也是先创建一个回显式服务器,通过继承来实现字典翻译的功能。

package 网络编程;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

/**
 * @author zq
 * 服务器
 */
public class UdpEchoServer {
    //需要先定义一个socket对象。
    //通过网络通信,必须要使用socket对象
    private DatagramSocket socket = null;
    //抛异常,因为绑定不一定成功,比如某个端口被别的占用
    //同一个主机上一个端口只能被一个进程绑定。
    public UdpEchoServer(int port) throws SocketException{
        //构造socket的同时,指定要关联的端口
        socket = new DatagramSocket(port);
    }
    //启动服务器的主逻辑
    public void start() throws IOException {
        System.out.println("服务器启动");
        while (true){
            //每次循环,都要做三件事情
            //1.读取请求并解析
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            //为了方便处理这个请求,我们把数据包转成String
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());
            //2.根据请求计算响应
            String response = process(request);
            //3.把响应结果写回客户端
            //根据response字符串构造一个DatagramPacket
            //和请求packet不同,此处构造响应的时候,需要指定这个包要发给谁
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length
                    //requestPacket是从客户端这里收来的,getSocketAddress就会得到客户端的ip和端口
                    ,requestPacket.getSocketAddress());
            socket.send(responsePacket);
            System.out.printf("[%s:%d] req : %s, resp: %s\n",           requestPacket.getAddress().toString(),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();
    }

}

字典翻译服务器代码:

package 网络编程;

import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zq
 * 实现翻译的客户端服务器
 */
public class UdpDictSever extends UdpEchoServer {
    private Map<String,String> dict = new HashMap<>();

    //调用构造方法
    public UdpDictSever(int port) throws SocketException {
        super(port);
        dict.put("dog","小狗");
        dict.put("cat","小猫");
        dict.put("hello","你好");
        dict.put("love","爱");
        //可以无限制添加很多数据
    }
    //重写process方法
    @Override
    public String process(String request){
        return dict.getOrDefault(request,"该单词没有查到");

    }

    public static void main(String[] args) throws IOException {
        UdpDictSever udpDictSever = new UdpDictSever(9090);
        udpDictSever.start();
    }
}

4. UDP版本字典翻译客户端

package 网络编程;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * @author zq
 * UDP版本的客户端服务器程序(回显程序)
 */
public class UdpEchoClient {
    private DatagramSocket socket = null;
    private String serverIP;
    private int serverPort;
    
    //客户端启动,需要知道服务器在哪里。
     public UdpEchoClient(String serverIP,int serverPort) throws SocketException {
        //对于客户端来说,不需要显示关联端口
        //不代表没有端口,而是系统自动分配了个空闲的端口。
        socket = new DatagramSocket();
        this.serverIP = serverIP;
        this.serverPort = serverPort;
    }

    public void start() throws IOException {
         //通过这个客户端可以多次和服务器进行交换
        Scanner scanner = new Scanner(System.in);//用户输入
        while (true){
            //1.先从控制台,读取一个字符串过来
            // 先打印一个提示符,提示用户要输入内容
            System.out.println("->");
            String request = scanner.next();
            //2.把字符串构造成UDP packet,(传输层的数据报)并进行发送
            DatagramPacket requestPacket =  new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serverIP),serverPort);
            socket.send(requestPacket);
            //3.客户端尝试读取服务器返回的响应。接收返回的数据报
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);//receive方法中的参数传空
            //4.把响应数据转换成String显示出来
            String response = new String(responsePacket.getData(),0
                    ,responsePacket.getLength());
            System.out.printf("req: %s,resp: %s\n",request,response);
        }
    }
    public static void main(String[] args) throws IOException {
        UdpEchoClient udpEchoClient = new UdpEchoClient("127.0.0.1",9090);
        udpEchoClient.start();

     }
}

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

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

相关文章

【k8s】Wordpress(PHP+nginx+mysql)迁移到k8s

一、迁移思路&#xff1a; 1、制作服务镜像; 1.1 挑选合适的基础镜像; 1.2 准备代码相关的文件; 1.3 通过dockerfile构建镜像;2、制作Kubernetes服务&#xff0c;并完成调度; 2.1确定服务运行的模式&#xff08;内部运行or 对外提供); 2.2确定服务所使用的控制器; 2.3服务是否…

【邀请函】第四届宁德国际新能源电池与智造技术产业大会(4月26 宁德)| 达索系统百世慧®

未来5-10年&#xff0c;新能源电池行业将呈现“一大支柱、两大应用场景、多元化技术线路”的发展特征。动力锂电池仍将主导新能源电池产业&#xff0c;并加速乘用场景落地。随着技术的日趋成熟&#xff0c;量产后成本下降&#xff0c;优势逐步凸显。 但随着技术迭代&#xff0…

Maya 贴图链接检测重链打包插件tjh_lost_textures_finder 1.3.3

一、问题描述&#xff1a; maya在模型材质贴图及渲染制作流程中&#xff0c;经常会遇到工程文件路径更改后&#xff0c;图片链接失效的问题&#xff0c;还有就是萌新们不懂规矩&#xff0c;图片路径乱放&#xff0c;而造成的图片打包时巨大工作量&#xff0c;南无阿弥陀佛。此…

vue关于echarts后端返回格式取值方法

在vue中&#xff0c;接口返回如下数据&#xff1a; data: {充电桩: [0, 0, 78], 红外摄像头: [0, 0, 0], 火焰探测器: [0, 1, 0], 烟雾传感器: [0, 1, 1], 限流保护器: [0, 0, 1]}&#xff0c; 其中数组里第一个值应该放在data1&#xff0c;第二个放在data2&#xff0c;第三个…

LCHub:微软Power Apps成为保险行业最受欢迎低代码平台

全球领先的保险行业软件服务商Adacta发布了《保险行业低代码应用情况》报告,深度揭示了保险领域对低代码的应用、市场增长、发展趋势等。 该报告对来自德国、奥地利、瑞士、法国、英国、比利时、荷兰和卢森堡等国家的100名保险行业的高管进行了深度调查。(发送“保险低代码”…

社科院杜兰大学金融管理硕士项目——不要停止奔跑,前方更值得期待

不要停止奔跑&#xff0c;不要回顾来路&#xff0c;来路无可眷恋&#xff0c;唯有前方值得期待。——《马男波杰克》。这段话很适用在职的我们&#xff0c;当我们在职场经过打磨&#xff0c;我们被磨平了棱角&#xff0c;被磨掉了脾气&#xff0c;但我们依然相信前方会更值得我…

安装和部署elasticsearch

文章目录 一、安装elasticsearch1.1 部署单点elasticsearch1.1.1 创建网络1.1.2 安装镜像1.1.3 部署1.1.4 测试 1.2 部署kibana1.2.1 安装镜像1.2.2 部署1.2.3 测试1.2.4 DevTools工具 1.3 安装IK分词器1.3.1 安装ik插件1.3.2 查找数据卷目录1.3.3 上传至容器1.3.4 测试 一、安…

腾讯优图入选人工智能顶级会议AAAI论文--10篇

人工智能领域的国际顶级会议AAAI 2020将于2月7日-2月12日在美国纽约举办。近年来随着人工智能的兴起&#xff0c;AAAI每年举办的学术会议也变得越来越火热&#xff0c;每年都吸引了大量来自学术界、产业界的研究员、开发者投稿、参会。 以AAAI2019为例&#xff0c;论文提交数量…

工单管理系统的好处

工单管理系统是一款能够实现业务流程管理&#xff0c;工作任务管理&#xff0c;服务项目管理的工具。该系统能够帮助企业提高客户服务质量、加快企业服务响应速度、降低企业运营成本。 工单管理系统能通过制定计划和控制流程来减少客户投诉&#xff0c;提高客户满意度。可以说…

为什么安全从业者应该了解业务

不久之前&#xff0c;网络安全还被视为独立于企业其他部分的事物。但在过去的十年里&#xff0c;它终于得到了当之无愧、渴望已久的认可和关注。 越来越多的公司聘请首席信息安全官来帮助制定整体业务战略&#xff0c;使安全成为公司董事会的首要任务。 最后&#xff0c;首席…

k8s允许master节点参与调度的设置方法

默认情况下&#xff0c;master节点是不参与调度的&#xff0c;且在master节点上有一个污点NoSchedule&#xff08;表示k8s将不会将Pod调度到具有该污点的Node上&#xff09;&#xff0c;有关污点章节可参考https://www.cnblogs.com/panw/p/16343392.html 如果想让master节点参与…

云原生可观测性平台deepflow部署

deepflow是什么 DeepFlow 是云杉网络 (opens new window)开源的一款高度自动化的可观测性平台&#xff0c;是为云原生应用开发者建设可观测性能力而量身打造的全栈、全链路、高性能数据引擎。DeepFlow 使用 eBPF、WASM、OpenTelemetry 等新技术&#xff0c;创新的实现了 AutoT…

界面控件DevExpress WinForm的垂直网格组件,让数据展示更灵活!(一)

DevExpress WinForm Vertical Grid&#xff08;垂直网格&#xff09;组件设计用于提供UI灵活性&#xff0c;它允许显示数据集中的单个行&#xff0c;或在其90度反向网格容器中显示多个数据集行。此外&#xff0c;开发者还可以将其用作属性网格&#xff0c;就像在Visual Studio …

逻辑回归与梯度下降法

逻辑回归&#xff1a;是用来进行分类的。 逻辑回归的线性预测输出可以写成&#xff1a;y^wTxb 引入Sigmoid函数&#xff0c;让输出限定在[0,1]之间&#xff0c;y^Sigmoid(wTxb)σ(wTxb) 单个样本损失函数&#xff1a;L(y^,y)−(ylog y^(1−y)log (1−y^)) 对逻辑回归进行梯度…

【pytorch系列】优化器optimizer的使用与常用优化器

1 optimizer类实例 1.1 介绍 属性 【default】该实例的类型为 dict&#xff0c;元素为初始化时候的学习率等&#xff0c;具体的keys为 [lr,momentum, dampening, weight_decay, nesterov]【state】保存参数更新过程中的一些中间变量&#xff0c;如momentum的缓存&#xff08…

网络安全-kali配置ssh服务+敏感文件泄+dirsearch脚本

网络安全-kali配置ssh服务敏感文件泄dirsearch脚本 seccure shell 就是加密的telnet 远程用的 service ssh start 开启ssh服务metstat -tpan |gerp 22 监听这个端口是否开启 可以看到本地的22端口这个文件是/etc/ssh/sshd_config 输入 set number 找到第57行 把这个前面的#注…

Smartbi电子表格软件产品的由来

思迈特软件&#xff08;以下简称“Smartbi”&#xff09;自2022年11月以来发布的「Smartbi Spreadsheet 电子表格软件」产品&#xff08;以下简称“电子表格软件”或"Spreadsheet"&#xff09;。 这个软件就是报表工具&#xff0c;那为什么不叫 Report&#xff0c;而…

java 自习室找座系统 mysql

自习室座位管理系统采用B/S结构、结合网络数据库开发技术来设计本系统。开发语言采用JSP&#xff0c;数据库使用Mysql数据库。完成以下基本功能&#xff1a; 功能&#xff1a; 1界面&#xff08;管理员登录、学生登录&#xff09; 2管理员更新自习室剩余座位情况 3学生查询自习…

误差与精度

整理自《误差理论与数据处理》——合肥工业大学 机械专业用于教授学生误差与精度概念的课程叫做《公差与测量》&#xff0c;而公差的本质含义就是误差&#xff0c;所以这门课其本质教授的还是误差理论。当时在学校并没有好好学习这么课程&#xff0c;工作之后才发现这个课程的重…

云原生时代,不可不知的基础设施即代码(IaC)

&#x1f4a1; IaC 是 DevOps 的必要支撑。 近日&#xff0c;在极狐TechTalk 直播上&#xff0c;极狐(GitLab) 高级网站可靠性工程师SRE 戚加欣&#xff0c;从 SRE 视角出发&#xff0c;与大家分享了 IaC 基础知识、工具和方法和基于极狐GitLab 的具体实践经验。 以下内容整理自…