UDP SocketAPI

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 转成一个stringString 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 - 65535UdpEchoServer 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不同,就重写这个方法即可@Overridepublic 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.hqwc.cn/news/2786.html

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

相关文章

OpenStack(3)--vxlan网络实战

目录 一、ML2配置文件 二、上传cirros镜像 三、创建vxlan10网络 四、创建实例/同vxlan通信测试 五、不同vxlan通信测试 5.1 新建vxlan11 5.2 新建路由/添加路由接口 5.3 不同vxlan通信测试 5.4 qemu-vnc报错 六、深度剖析vxlan 七、认识 Bridge br-ex、Bridge br-in…

基于matlab基于预训练的膨胀双流卷积神经网络的视频分类器执行活动识别(附源码)

一、前言 此示例首先展示了如何使用基于预训练的膨胀 3-D &#xff08;I3D&#xff09; 双流卷积神经网络的视频分类器执行活动识别&#xff0c;然后展示了如何使用迁移学习来训练此类视频分类器使用 RGB 和来自视频的光流数据 [1]。 基于视觉的活动识别涉及使用一组视频帧预…

PHY芯片的使用(一)之基本概念讲解(MII相关)2

今天想和大家交流一下MAC和PHY之间的接口MII。 MII(Media Independent Interface )是介质无关接口。MII接口定义了在MAC层和物理层之间传送数据和控制状态等信息的接口&#xff0c;它是10M和100M兼容的接口&#xff0c;经过扩展后还可以用于1000M的MAC层与物理层的接口&#x…

【国产复旦微FMQL45教程】-小试牛刀之LED

本教程采用 FMQL7045 FPGA开发板来完成整个试验&#xff0c;板卡照片如下&#xff1a; 具有丰富的接口资源&#xff0c;系统框图如下&#xff1a; 本教程用于完成基于Vivado的FMQL45的LED实验&#xff0c;目标是能够将这款开发板PL端先跑起来。 对于纯 PL 设计&#xff0c;我们…

计算机网络—局域网

文章目录 ARP协议以太网以太网帧结构交换机交换机的端口划分 PPP协议 MAC地址 封装在链路帧中的地址&#xff0c;作为每一个接口的地址。&#xff08;一般是48bit大小&#xff09; MAC地址是刻画到我们物理接口上的&#xff0c;我们的网卡一旦出厂之后就会携带一个唯一的物理地…

SAP 后台配置之FM基金管理篇

SAP FM基金管理后台配置及应用 1 二话不说先上后台配置&#xff0c;能跑通为先1.1 基础设置1.1.1 维护财务管理区1.1.2 分配财务管理区1.1.3 激活全局基金管理功能1.1.4 定义全局参数1.1.5 定义编号区间编号并分配1.1.6 创建更改层次变式1.1.3 激活科目分配元素1.1.4 设置允许空…

微信小程序 rich-text富文本框 怎么设置里面节点的样式

1、在JS中我们获取数据&#xff0c;在没有类名的情况下 使用正则匹配你想要添加演示的节点 res[1].data[0].f_content为rich-text里面的节点 如图 代码&#xff1a;让获取的节点中的图片的最大宽度为100%,高度为auto this.content res[1].data[0].f_content.replace(/\<…

Java泛型详解:为什么使用泛型?如何使用泛型?

Java泛型详解&#xff1a;为什么使用泛型&#xff1f;如何使用泛型&#xff1f; &#x1f498;一、为什么使用泛型&#xff1f;&#x1f498;二、如何使用泛型&#xff1f;&#x1f496;1. 泛型类的使用&#xff1a;&#x1f496;2. 泛型方法的使用&#xff1a;&#x1f496;3.…

Python高级教程:简单爬虫实践案例

学习目标 能够知道Web开发流程 能够掌握FastAPI实现访问多个指定网页 知道通过requests模块爬取图片 知道通过requests模块爬取GDP数据 能够用pyecharts实现饼图 能够知道logging日志的使用 一、基于FastAPI之Web站点开发 FastAPI是一个高性能、易于使用、快速编写API的…

java实现布隆过滤器(手写和Guava库提供的)

目录 前言 布隆过滤器的原理 插入​编辑 查询 删除 布隆过滤器优缺点 优点&#xff1a; 缺点&#xff1a; 代码实现 方式一&#xff1a; Google Guava 提供的 BloomFilter 类来实现布隆过滤器 到底经过几次哈希计算 解决缓存穿透 方式二&#xff1a;手写 前言 在学…

Springboot 核心注解和基本配置解读

目录 1. Springboot 入门与原理 1.1 Springboot 简介 1.1.1 什么是Springboot 1.1.2 Springboot 主要优点 1.2 Springboot 相关注解 1.2.1 元注解 1.2.1.1 Target 1.2.1.2 Retention 1.2.2 Configuration 1.2.3 Import 1.2.3.1 直接注入 1.2.3.2 实现 ImportSelector…

基于Java+Vue前后端分离开放式教学评价管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…