基于udp实现回显服务器,翻译服务器

news2024/11/27 17:47:41

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

udp socket 要掌握的类:

1.DatagramSocket

2.DatagramPacket

一、udp版本回显服务器

服务端:

完整代码

客户端:

完整代码

udp版本翻译服务器:

 代码:





udp socket 要掌握的类:

1.DatagramSocket

是UDP Socket,用于发送和接收UDP数据报。(网卡的代言人)

构造方法:

 第一种一般用于客户端,第二种一般用于服务器

其他方法:

 总结:socket本质上也是文件

socket对应到网卡这个硬件设备,操作系统也是把网卡当做文件来管理的

通过网卡发送数据写文件

通过网卡接受数据读文件

文件操作要先打开文件,然后读文件,最后关闭对应到socket上,构造方法相当于打开,receive,send相当于写,close相当于关闭

2.DatagramPacket

代表一个udp数据报,也就是一次发送接受的基本单位

构造方法

其他方法:

一、udp版本回显服务器

服务端:

1.绑定端口:

一个端口只能绑定一个进程

2.启动服务器:

 3.接受命令:

4.处理响应:

5..响应写会客户端
 

InetSocketAddress(getAddress(), getPort());

 6.打印日志

完整代码

package net_1011;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchnoServer {
        private DatagramSocket socket=null;
        //参数的端口表示咱的服务器要绑定的端口
        public UdpEchnoServer(int port) throws SocketException {
            socket=new DatagramSocket(port);
        }
        //通过这个方法启动服务器
        public void start()throws IOException{
            System.out.println("服务器启动!");
            while(true){
                //循环里面处理一次请求
                //读取请求并解析
                DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
                socket.receive(requestPacket);
                //把这个DatagramPacket对象转变成字符串,方便去打印
                String request=new String(requestPacket.getData(),0,requestPacket.getLength());
                //2.根据请求计算相应
                String response =process(request);
                //3.把相应写回到客户端
                DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,
                        requestPacket.getSocketAddress());
                socket.send(requestPacket);
                //4.打印一个日志,记录当前的情况
                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 {
            UdpEchnoServer server=new UdpEchnoServer(9090);
            server.start();
        }
    }

客户端:

1.绑定端口(注意区别)Ip+端口

 服务器的ip一般都是本机ip不需要绑定,当涉及多个网卡,多个Ip,访问指定ip地址,服务器才要手动指定ip

2.注意构造方法没有指定参数

//这里并不是说没有端口,而是让系统自动指定一个空闲的端口

系统分配的空闲端口,避免用户乱输入端口,导致影响到进程运行中的端口,

3.注意构造出的数据报是以字节为单位

 4.关于DatagramPacket构造的几种方式:

完整代码

package net_1011;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.SocketException;
import java.net.*;
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();
        //假设 serverIP 是形如 1.2.3.4 这种点分十进制的表示方式
        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请求,发送给服务器
            DatagramPacket requstPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(this.serverIP),this.serverPort);
            socket.send(requstPacket);
            //3.从服务器中读取udp响应数据,并解析
            DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(requstPacket);
            String response=new String(responsePacket.getData(),0,responsePacket.getLength());
            //4.把服务器的响应显示到控制台上
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient client=new UdpEchoClient("127.0.0.1",9090);
        client.start();
    }
}

 总的执行流程:

直观表示:

 怎样处理多个请求:

对于服务器来说

读取请求并接续,根据请求并计算相应,把响应写会到客户端执行速度极快,这时候如果有多个客户端发来请求,服务器也是可以响应的在服务器上本质是三个请求串行处理的

如果处理不过来,采用分布式

udp版本翻译服务器:

 代码:

package net_1011;

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

public class UdpTranslateServer extends UdpEchnoServer{
    //翻译是啥?本质上就是 key ->value
    private Map<String,String>dict=new HashMap<>();
    public UdpTranslateServer(int port) throws SocketException {
        super(port);
        dict.put("cat","小猫");
        dict.put("dog","小狗");
        dict.put("fuck","卧槽");
        //在这里就可以填入很多很多内容,像有道词典程序就这样
    }

    //重写process 方法,实现查询哈希表的操作
    @Override
    public String process(String request){
        return dict.getOrDefault(request,"词在词典中未找到");
    }

    //start方法和父类完全一样,不用写了
    public static void main(String[]args) throws IOException{
        UdpTranslateServer server=new UdpTranslateServer(9090);
        server.start();
    }
}

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

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

相关文章

Spring注入和生命周期

目录 获取Bean对象&#xff08;对象装配&#xff09; 属性注入 构造注入 Setter注入 三种注入的优缺点分析 注入的注解&#xff1a; 一个类型多个bean对象的注入方式 1.让变量名等于bean的id 2.用Resource注解&#xff08;name“bean的id”&#xff09; 3.用Qualif…

Java 核心技术 0 —— Class加载 和 运行时数据区域

JVM 是 字节码的运行环境&#xff0c;负责装载class到JVM内部&#xff0c;解释编译为对应平台的机器码指令进行执行&#xff0c;对于JVM设计有权威的定义规范&#xff0c;了解 JVM 类加载各部的主要功能 和 运行时数据区域组成 很有意义。 磁盘上有一个.java文件&#xff0c;通…

【目标检测】swin-transformer训练自己的数据集

文章目录1. 数据集的制作1.1. Labelme制作数据集1.2 COCO数据集格式2. 配置swin-transformer3. 训练自己的数据集4. 训练5.参考链接1. 数据集的制作 1.1. Labelme制作数据集 pip install labelme然后在桌面搜索框中找到labelme&#xff0c;然后打开&#xff0c;或者直接在命令…

Python 工匠 第一章 变量与注释

1.1 基础知识 1.1.1 变量常见用法 Python 是一门动态类型的语言&#xff0c;因此无须提前声明变量类型&#xff1b;并且由于其是弱类型语言&#xff0c;即可以更改其变量类型。动态类型语言/弱类型语言 a 10 # 不需要提前声明变量类型 a "a" # 可以更改其变量类…

【架构师】解决方案架构师常用的5种类型架构图

0. 背景 在给不同部门的同学讲解系统时&#xff0c;如果用手势解释解决方案&#xff0c;还有很多“这块和这块通过...”在解释复杂的概念时&#xff0c;大部分人都会晕。我们需要一个视觉效果。有人说一个架构图不就行了吗&#xff1f;但架构图不是一个“放之四海而皆准”的解决…

一、springcloud-eureka服务注册与发现

SpringCloud简介 Spring Cloud 为开发者提供了工具来快速构建分布式系统中的一些常见模式&#xff08;例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话&#xff0c;集群状态&#xff09;。分布式系统的协调导致了样板…

04 Vue属性配置

1、ref属性 App.vue代码&#xff1a; <template><div><h1 v-text"msg" ref"myTitle"></h1><button click"showDom">点我输出上方的DOM元素</button><school ref"school" id"sch"/&…

Node.js | Express+MongoDB 实现简易用户管理系统(一)(项目搭建 | RESTful API架构 | 前后端交互)

&#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f5a5;️ TypeScript知识总结&…

【javaEE】多线程进阶(Part1 锁策略、CAS、synchronized )

目录前言/补充4. 描述一下线程池的执行流程和拒绝策略有哪些&#xff1f;【面试题&#xff01;】一、常见锁策略一&#xff09;乐观锁VS悲观锁二&#xff09;读写锁VS普通互斥锁三&#xff09;重量级锁VS轻量级锁四&#xff09;自旋锁VS挂起等待锁五&#xff09;公平锁VS非公平…

Vue框架背后的故事

文章目录前言Vue萌芽Vue名字的由来因着Vue免试进入MeteorVue逐步完善Taylor推荐VueVue因受质疑发布1.0LinusBorg加入萌生全职做Vue想法Vue在恰到好处的时机出现探索经济来源Serah Drasner加入全职投入Vue建设Vue引入国内Vue受拥国内Vue在决策背景方面的独有优势总结本期推荐前言…

JVM垃圾回收系列之垃圾收集器二

随笔 最近两个星期因为要忙公司项目上线的事情以至于发表的文章会显得碌碌庸流&#xff0c;在此以示歉意 引言 本文将介绍HotSpot中的G1GC 参考书籍&#xff1a;“深入理解Java虚拟机” 个人java知识分享项目——gitee地址 个人java知识分享项目——github地址 G1GC 介…

双向链表的操作

什么是双向链表&#xff1f; 指针域&#xff1a;用于指向当前节点的直接前驱节点&#xff1b; 数据域&#xff1a;用于存储数据元素。 指针域&#xff1a;用于指向当前节点的直接后继节点&#xff1b; typedef struct line{struct line * prior; //指向直接前趋&#xff0c;结…

超级简单的机器学习入门

超级简单的机器学习入门 文章目录超级简单的机器学习入门0.写在前面1.机器学习基本概念2.机器学习算法的类型2.1 监督学习2.2 无监督学习2.3 监督学习和无监督学习的对比2.4 强化学习3.机器学习的三个基本要素3.1 模型3.2 学习准则3.2.1 损失函数3.2.2 欠拟合和过拟合&#xff…

MySQL数据库 || 增删改查操作详解

目录 前言&#xff1a; 插入数据 查询数据 全列查询 指定列查询 带表达式查询 去重查询 查询结果排序 条件查询 比较运算符 逻辑运算符 示例 模糊查询 示例 空值比较 分页查询 修改数据 删除数据 注意&#xff1a; 前言&#xff1a; &#x1f388;增删改查…

Flutter——常用布局

Flutter—常用布局效果图widget 树形图左布局Text评分条提示内容右布局应用Stack布局效果图释示例效果图释电影封面电影信息电影演员电影简介应用效果图 widget 树形图 整个界面由一行组成&#xff0c;分为两列&#xff1b;左列包括电影介绍&#xff0c;由上到下垂直排列&…

java计算机毕业设计ssm+jsp线上授课系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习线上授课的相关知识以及网络提供的技术应用教程&#xff0c;以线上授课的实际应用需要出发&#xff0c;架构系统来改善现线上授课工作流程繁琐等问题。不仅如此以操作者的角度来说&#xf…

【JavaSE】关于数组

文章目录数组的创建与初始化数组的初始化静态初始化动态初始化数组的存储null打印数组的三种方式循环遍历打印foreach打印Arrays.toString()打印数组的练习冒泡排序常用的API数组拷贝Arrays.copyOf()数组排序Arrays.sort()数组的快速初始化Arrays.fill()二维数组数组的创建与初…

mysql之MHA的高可用

一、MHA概述 1.什么是 MHA&#xff1a; MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点故障的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作…

1分钟完成在线测试部署便捷收集班级同学文件的web管理系统

最近CSDN推出了一个新功能【云IDE】&#xff0c;个人对这个新功能(比赛奖金 )挺感兴趣的&#x1f92d;&#xff0c;于是瞬速地拿之前自己搞的一个便捷收集班级同学文件的web管理系统&#xff08;下面简称该项目为cfile&#xff09;体验了一下&#xff0c;发现功能还是挺好用的&…

Node.js 实战 第1章 欢迎进入Node.js 的世界 1.5 三种主流的Node 程序 1.6 总结

Node.js 实战 文章目录Node.js 实战第1章 欢迎进入Node.js 的世界1.5 三种主流的Node 程序1.5.1 Web 应用程序1.5.2 命令行工具和后台程序1.5.3 桌面程序1.5.4 使用Node 的应用程序1.6 总结第1章 欢迎进入Node.js 的世界 1.5 三种主流的Node 程序 Node 程序主要可以分成三种类…