UDP SocketAPI

news2024/10/7 18:29:13

1、TCP与UDP区别

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

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

2、UDP  sockeAPI的核心类

DatagramSocket:相当于对socket文件进行封装,有了socket文件以后,就可以真正操作网卡,发送和接收数据。

DatagramPacket:发送和接收数据的基本单位。

close方法,在下面代码中没有用到,文件打开之后要及时关闭,为啥下列代码不进行关闭呢?

 代码中的socket对象,生命周期伴随整个进程,因此进程结束前,提前关闭socket对象不合适,当进程结束时,对应的PCB也没了,PCB文件上的文件描述符表也没了,也就相当于关闭了。

3、客户端和服务器的工作流程

 

一、回显

1、服务器

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

public class UdpEchoServer {
    //要想创建udp服务器,首先要打开一个socket文件
    private DatagramSocket socket = null;

    public UdpEchoServer(int port) throws SocketException {
        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);
            //2、对请求进行解析,把datagramPacket 转成一个string
            String request = new String(requestPacket.getData(),0, requestPacket.getLength());
            //3、根据请求,处理响应,虽然咱们这个是回显服务器,但还是可以搞个单独的方法来做这个事情
            String response = process(request);
            //4、把响应构造成 DatagramPacket 对象返回给客户端
            //   构造响应对象,要搞清楚,对象要发给谁(谁给咱们发的请求,就把响应发给谁!!)
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());
            //5、把这个DatagramPacket 对象返回给客户端
            socket.send(responsePacket);
            System.out.printf("[%s:%d] req=%s ; resp=%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);
        }
    }
    //通过这个方法,实现根据请求计算响应这个过程
    //但是由于是回显服务器,所以不涉及到其他逻辑,但如果是其他服务器,就可以在 process 里面,来加上一些其他逻辑的处理
    public String process(String req){
        return req;
    }

    public static void main(String[] args) throws IOException {
        //main方法是真正启动服务器,这个端口号说是随便写,但是也是有范围的,0 - 65535
        //一般来说1024以下的端口,都是系统保留,一般不使用
        //因此咱们写代码,端口号尽量选择 1024 - 65535
        UdpEchoServer server = new UdpEchoServer(8000);
        server.start();
    }
}

2、客户端

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

public class UdpEchoClient {
    private DatagramSocket socket = null;

    public UdpEchoClient() throws SocketException {
        //客户端的端口号,一般是由操作系统自动分配,虽然手动指定也行,习惯上还是自动分配比较好
        socket = new DatagramSocket();
    }

    public void start() throws IOException {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            //1、让客户端从控制台读取一个请求数据
            System.out.print("> ");
            String request = scanner.next();
            //2、把这个字符串请求发送给服务器,构造 DatagramPocket
            //   构造的DatagramPocket 既要包含传输的数据 ,又要包含把数据发送到哪里
            DatagramPacket requestPocket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName("127.0.0.1"),8000);
            socket.send(requestPocket);
            //4、从服务器读取响应数据
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            //5、把响应数据获取出来,转成字符串
            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();
        udpEchoClient.start();
    }
}

二、翻译服务器

在回显服务器的基础上,运用hash MAP

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

public class UdpDictServer extends UdpEchoServer{
    private Map<String,String> dict = new HashMap<>();
    public UdpDictServer(int port) throws SocketException {
        super(port);
        dict.put("cat","小猫");
        dict.put("dog","小狗");
        dict.put("baobao","瑾瑾");

    }

    //和 UdpEchoServer 相比,只是process不同,就重写这个方法即可
    @Override
    public String process(String req) {
        return dict.getOrDefault(req,"这个词俺也不知道");
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer server = new UdpDictServer(8000);
        server.start();
    }
}

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

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

相关文章

Swift 单元测试入门

含义&#xff1a;编程语言中的单元测试是为了确保编写的代码按预期工作。 给定一个特定的输入&#xff0c;希望代码带有一个特定的输出。通过测试代码&#xff0c;能够给当前的重构和发布建立信心&#xff0c;因为将能够确保代码在成功运行的测试套件后按预期工作。 一、单元测…

macos中回退键是Command+shift+z,我该如何改成Command+y?

macos中回退键是Commandshiftz&#xff0c;我该如何改成Commandy? 操作如下&#xff0c;打开系统设置-键盘 在「菜单标题」中手动输入需要更改快捷键的菜单项名称&#xff0c;注意要完全一致&#xff08;见下图&#xff09;。 最后说一句&#xff0c;撤销与重做是非常基础的系…

VS2017编译64位库出现问题解决方法

1、问题&#xff1a;VS2017编译32位Release库正常通过,但是64位库总是报错 解决方法&#xff1a;添加setupapi.lib到依赖项中

线性代数笔记整理

文章目录 1 行列式2 矩阵&#xff08;本质是数表&#xff09;3 方程组的解4 向量5 矩阵的特征值和特征向量6 相似矩阵和相似对角化7 合同对角化8 二次型及其标准型 1 行列式 2 矩阵&#xff08;本质是数表&#xff09; 3 方程组的解 4 向量 5 矩阵的特征值和特征向量 6 相似矩阵…

【MATLAB第47期】基于MATLAB的多卷积层的卷积神经网络MCNN分类预测模型,含交叉验证,可自定义层数

【MATLAB第47期】基于MATLAB的多卷积层的卷积神经网络MCNN分类预测模型&#xff0c;含交叉验证&#xff0c;可自定义层数 一、展示效果 依次对比卷积层数为1/2/3时的分类预测结果 可得出&#xff0c;随着卷积层数量增加&#xff0c;训练集/测试集正确率基本上得到改进。 1.一…

GPIO模拟时序控制外设4——红外发射管

文章目录 前言红外发射管简介NEC协议HS0038NEC 的逻辑“1”与逻辑“0”NEC的数据帧格式 编程思路1. GPIO管脚2. 模拟同步头3.发送逻辑“0”与逻辑“1”发送一个字节数据发送一帧数据结束码现象 总结 前言 上一篇介绍了使用GPIO模拟时序实现I2C协议的功能&#xff0c;本文继续使…

DELL戴尔笔记本电脑灵越Inspiron 14 54105418原厂Win10系统恢复原装OEM出厂状态系统

Dell戴尔笔记本电脑&#xff0c;灵越Inspiron 14 5410&5418原装出厂OEM系统镜像原厂系统文件 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件等预装程序 链接&#xff1a;https://pan.baidu.com/s/1Qj_dW5lj71e9d71-je4dXw?pwdz3z1 提取码&#xff1a;z3z1

Oracle Recovery Tools恢复csc higher than block scn---惜分飞

有客户强制关闭数据库,结果有数据块报坏块,dbv检查为:csc higher than block scn问题 该问题主要是由于scn异常导致通过Oracle Recovery工具进行修复 dbv再次验证数据块ok,Oracle Recovery完美代替bbed解决该问题 通过OraRecovery工具快速解决csc higher than block scn故障…

IntelliJ IDEA如何自动生成serialVersionUID

IntelliJ IDEA如何自动生成serialVersionUID&#xff1f; 实体对象在流中传输时&#xff0c;需要将其序列化。 对象的类型实现Serializable接口public class ClassName implements java.io.Serializable { } 生成版本号serialVersionUID单击类名&#xff0c;按Alt Enter,在出…

C语言的##使用

##在C/C中具有连接字符串的作用 #include<stdio.h> #define TEST(_name, _inst_alloc) \printf("token6 %d\n",_name##_inst_alloc); int main() {int token6 100;TEST(token, 6);return 0; }

[环境配置][原创]VS2019新建项目一直打转转圈很久才能正常显示模板项目

不知道什么时候VS2019新建一个C#或者C项目越来越慢&#xff0c;点击新建项目一直是下面状态 我记得以前最多等个几秒都是可以出来的&#xff0c;后面发现要一分钟以上。这个确实令人抓狂。于是找到一种方法可以明显改善这个问题&#xff0c;那就是卸载Nsight相关程序。一般都是…

软考高级系统架构设计师(四) 计算机网络3物联网云计算

目录 物联网 关键技术 云计算 物联网 PS&#xff1a;可能下午题 关键技术 射频识别、二维码&#xff08;感知层&#xff09; 云计算

为什么游戏总是闪退?游戏闪退的原因和解决方法

在玩游戏的过程中&#xff0c;会有游戏突然关闭的情况&#xff0c;游戏闪退后回到电脑桌面或游戏主界面&#xff0c;十分影响游戏体验。端午开黑在际&#xff01;驱动人生游戏助你攻克游戏闪退&#xff0c;带来游戏闪退的原因和解决方法。 **1、设备性能不足&#xff1a;**某些…

ElasticSearch-IK分词器介绍和下载

IK分词器 什么是IK分词器&#xff1f; 分词:把一段中文或者别的划分成一个一个的关键字,我们在搜索的时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如"我爱魏一鹤"会被分成&quo…

hive引入外部函数-java实现

引入依赖 <dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.2</version> </dependency>编写函数 注意必须要继承GenericUDF 类 import org.apache.hadoop.hive.ql.exec.UDF…

5.按键输入

1.按键介绍&#xff1a; 按键WK_UP接在低电平&#xff0c;当按键按下检测到高电平&#xff1b;KEY0和KEY1接在高电平&#xff0c;当按键按下检测到低电平&#xff1b; 2.本次实验步骤&#xff1a; &#xff08;1&#xff09;GPIO输入操作&#xff1a; 读取IO口输入电平的库…

vue中实现将html导出为word文档

需求&#xff1a;将页面整成理想样式&#xff0c;将想要的那一部分页面导出成word,不用写模板&#xff0c;按照当前页面样式导出即可。&#xff08;简易版&#xff09; 保姆级别教程&#xff1a; 第一步&#xff1a;安装需要的依赖 npm install html-docx-js -Snpm install …

第11讲:使用ajax技术实现文件上传功能(jQuery)

软件项目开发过程中,文件上传功能是常用技术之一,经常需要上传文件过程中为了更好的体验,不允许刷新当前页面,这样就必须使用异步上传技术了,jQuery提供了异步上传的多种方法,下面跟大家一起探讨使用jQuery.form插件上传文件的功能,具体实现过程如下: 环境要求 序号资…

【单片机】MSP430 单片机 多路温度巡回检测仪的设计

多路温度巡回检测仪的设计 多路温度检测仪共有3个测温点&#xff0c;每个点连续检测8次&#xff0c;以平均值代表该点温度&#xff0c;并同时在 LCD 显示器&#xff0e;器任选&#xff0c;测量精度为1℃。系统每隔1秒完成一个点的测量。 设计以msp430g2553为核心的多路温度检测…

深度学习笔记之一看数据

最近在百度ai上跟了个“深度学习7日打卡营”的课程&#xff0c;目前看到人脸关键点检测章节&#xff0c;地址如下&#xff1a;飞桨AI Studio - 人工智能学习与实训社区 (baidu.com) 老师们讲解的很好&#xff0c;但是对于我这样的白菜来说&#xff0c;有些细节还是感觉略过去了…