UDP套接字

news2025/2/26 18:04:24

大家好,又见面了,🎉🎉🎉🌸🌸🌸
今天为大家带来UDP套接字的相关知识
在这里插入图片描述

文章目录

  • 认识socket
    • UDP和TCP
    • 认识UDPAPI有关方法
    • 基于UDP实现回显服务器
    • UDP的方法
    • 基于UDP实现回显程序

认识socket

UDP和TCP

认识UDPAPI有关方法

基于UDP实现回显服务器

Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程
通俗一点来说也就是我们编写网络程序,主要写的是应用层代码,要发送数据的时候,需要上层协议调用下层协议,应用层调用传输层,传输层给应用层提供一组API,就叫做socketAPI
Java给我们提供了两组socketAPI,一个是基于UDP的API,一个是基于TCP的API,这俩有很大差别,我们来对比一下
UDP特点:
无连接,不可靠传输,面向数据报,全双工
TCP特点:
有连接,可靠传输,面向字节流,全双工
下面来具体解释一下什么是连接
这个问题比较抽象了,理解为通信双方,各自记录了对方的信息,就像结婚,通过一个结婚证,男方知道女方是老婆,女方知道男方是老公(相当于做了个记录,知道彼此是另一半)
无连接就是不需要刻意保存对方的相关信息
有连接就是需要刻意保存对端的信息
不可靠传输就是我的消息发了就发了,我不关心结果,爱咋咋地
可靠传输就是我的消息发出去,我尽可能发过去,关注结果
面向数据报就是在数据传输的时候,以一个UDP数据报为基本单位
面向字节流就是数据传输的时候以字节为基本单位,读写灵活
全双工就是一条路径,双向通信

在这里插入图片描述
举个例子,这个马路是双向通行的,那么就是全双工的
与之对应的就是半双工,就是只允许一方通行,就是单向通信

UDP的方法

下面我们来认识一下UDP API的方法
1.DatagramSocket API
此类表示用于发送和接收数据报数据包的套接字

DatagramSocket()
构造数据报套接字并将其绑定到本地主机上的任何可用端口。(一般来说用于客户端)
DatagramSocket(int port)
构造数据报套接字并将其绑定到本地主机上的指定端口。 (一般来说用于服务器)
void close()
关闭此数据报套接字 (socket也是文件,用完也需要关闭,不然会资源泄漏)
void receive(DatagramPacket p)
从此套接字接收数据报包。
void send(DatagramPacket p)
从此套接字发送数据报包。

DatagramPacket API

该类表示数据报包。
数据报包用于实现无连接分组传送服务。 仅基于该数据包中包含的信息,每个消息从一台机器路由到另一台机器。 从一台机器发送到另一台机器的多个分组可能会有不同的路由,并且可能以任何顺序到达。 包传送不能保证

DatagramPacket(byte[] buf, int length)
构造一个 DatagramPacket用于接收长度的数据包 length 。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号
DatagramPacket(byte[] buf, int offset, int length)
构造一个 DatagramPacket用于接收长度的分组 length ,指定偏移到缓冲器中
InetAddress getAddress()
返回该数据报发送或接收数据报的计算机的IP地址
int getPort()
返回发送数据报的远程主机上的端口号,或从中接收数据报的端口号
byte[] getData()
返回数据缓冲区

基于UDP实现回显程序

//服务器

package network;



import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;



public class UdpEchoServer {
    //先定义一个scoket对象
    //通过网络通信, 必须要使用 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
            //和requestPacket不同,此处构造响应的时候,需要指定这个包发给谁
            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 network;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;


public class TCPEchoClient {
    private Socket socket=null;

    public TCPEchoClient(String serverIp,int port) throws IOException {
        //这个操作相当于让客户端和服务器建立tcp连接
        //这里的连接连上了,服务器的accept就会返回
        socket=new Socket(serverIp,port);

    }
    public void start(){
        Scanner scanner=new Scanner(System.in);
        try(InputStream inputStream=socket.getInputStream();
            OutputStream outputStream=socket.getOutputStream()){
            PrintWriter printWriter=new PrintWriter(outputStream);
            Scanner scannerFromSocket=new Scanner(inputStream);
            while(true){
                //1.从键盘上读取用户输入的内容
                System.out.print("->");
                String request=scanner.next();
                //2.把读取的内容构造成请求,发送给服务器
                //注意,这里的发送,是带有换行的
                printWriter.println(request);
                //3.从服务器读取响应
                String response=scannerFromSocket.next();
                //4.把响应结果显示到控制台上
                System.out.printf("req: %S; resp: %s\n",request,response );
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    public static void main(String[] args) throws IOException {
        TCPEchoClient tcpEchoClient=new TCPEchoClient("127.0.0.1",9090);
        tcpEchoClient.start();

    }

}

现在来分析一下

在这里插入图片描述
在这里插入图片描述

来分析一下执行思路

1.服务器先启动,执行到receive进行阻塞
2.客户端运行之后,从控制台读取数据,并进行send
//走到这一步,客户端和服务器一起往下执行,所以会有两个3和两个4
3.客户端这边,send之后,继续往下走,走到receive读取响应,会阻塞等待
3.服务器这边,就从receive返回,读到数据(客户端发来的),往下走到process生成响应,到send,打印日志
4.客户端这边收到服务器send回来的数据后就会解除阻塞,执行下面的打印操作
4.服务器这边,进行下一轮循环,再次阻塞在receive那里,等到客户端发来的请求
5.客户端继续进入下一轮循环,阻塞在Scanner.next这里.等待用户输入数据

以上的流程是所有客户端和服务器交互的流程,比较复杂,需要理解!

socket可以实现跨主机通信!
这个点我们以后再说
今天的讲解到此结束,我们下期再见

在这里插入图片描述

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

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

相关文章

【数据结构】二叉树的概念及结构

🚀write in front🚀 📜所属专栏: 初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是…

Linux内核设备驱动设备树概念与使用

一、设备树概念以及作用 1.1设备树概念 设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比…

prometheus基本介绍

001 基本介绍 1.主要功能 多维数据模型(时序由metric名字和k/v的labels构成)灵活的查询语句无依赖存储,支持local和remote不同的模型采用http协议,使用pull模式,拉取数据,简单易懂监控目标,可…

session,zookeeper,mq-rabbitmq,kafka,websocket

spring-boot-demo-session pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

INSERT INTO IF NOT EXISTS问题

情景说明&#xff1a;工作上遇到一个树形结构的数据&#xff0c;如有文件夹和子文件夹这样的数据。由于后端逻辑问题&#xff0c;导致在前端页面操作了删除功能后&#xff0c;数据库中仅部分数据被删除&#xff0c;比如只把根节点或是父节点删除了&#xff0c;没有级联删除所有…

九龙证券|什么是庄家洗盘和出货?各有什么特征?

在股市独占的是庄家&#xff0c;在市场上独占的是商人。庄家的存在便是为了把资金投入市场变成本钱&#xff0c;使用本钱获取最大赢利。庄家的各类方法也是为了不惜一切代价获取最大赢利。今天我们来了解什么是庄家洗盘和出货&#xff1f;各有什么特征&#xff1f;下面就为大家…

所有知识付费都可以用 ChatGPT 再割一次?

伴随春天一起到来的&#xff0c;还有如雨后春笋般冒出的 ChatGPT / AI 相关的付费社群、课程训练营、知识星球等。 ChatGPT 吹来的这股 AI 热潮&#xff0c;这几个月想必大家多多少少都能感受到。 ▲ 图片来源&#xff1a;网络 这两张图是最近在圈子里看到的。 一张是国内各…

SpringBoot —— 日志基本操作

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ SpringBoot —— 日志基本操作一、日志的作用二…

Adobe全家桶功能介绍

Adobe全家桶是一套由Adobe公司开发的创意设计软件集合&#xff0c;包含了许多功能强大的软件&#xff0c;可以帮助用户完成各种创意设计任务。 以下是Adobe全家桶中一些主要软件的功能介绍&#xff1a; Photoshop&#xff1a;用于图像处理和编辑&#xff0c;可以进行图像裁剪…

Gradio介绍

Gradio App 就是给 AI 算法工程师训练的模型赋予分享给大众的能力。 从技术侧拆分&#xff0c;由三个部分组成&#xff1a; 前端页面 后端接口 AI算法模型推理 Gradio 做了一件事情&#xff0c;就是将这三个部分封装到一个 python 接口里&#xff0c;用户通过实现其封装的…

进来拿!最近疯传的154页微软 GPT-4早期实验报告:探究 AGI进化之路(全中文版)

这应该是&#xff0c;最近一段时间以来&#xff0c;关于 ChatGPT4.0剖析最全面的一份报告。 看懂10%&#xff0c;能帮我们对 ChatGPT 的认识&#xff0c;有一个质的跃升&#xff1b; 看懂50%&#xff0c;你将是分享 ChatGPT 知识领域最顶尖的那一拨人。 这份报告证明了 GPT-4…

Prometheus+Mysqld_exporter+Grafana从0到1搭建MySQL的可视化监控

目 录1. 准备工作1.1 安装MySQL1.2 安装Prometheus1.3 安装Mysqld_exporter1.4 安装Grafana2. 更改配置2.1 配置Mysqld_exporter2.2 配置Prometheus2.3 配置Grafana3. 小 结1. 准备工作 安装 MySQL 数据库安装 Prometheus安装 Mysqld_exporter安装 Grafana 在正式开始搭建之前…

面试官:如何在命令行跑Postman?

在接口自动化过程中&#xff0c;每次都打开postman工具来手动运行脚本显得不智能&#xff0c;所以可以通过命令在无UI或者其他持续集成的平台上执行脚本和数据。 01、环境准备与检查 环境准备 导出collection 安装node.js和cnpm 安装newman 环境检查 检测node.js&#x…

加密组件Jasypt学习、实战及踩坑记录

概述 最近入职新公司&#xff0c;因几乎全部项目都使用到jasypt&#xff0c;故而初步学习记录下本文&#xff08;持续更新&#xff09;。 官网及GitHub给出的简介&#xff1a;使用简单&#xff0c;性能好&#xff0c;特性features非常丰富&#xff1b;支持 另&#xff0c;有个…

leetcode刷题——字符串(双指针、滑动窗口、动态规划)

文章目录3.无重复字符的最长子串5.最长回文子串8. 字符串转换整数 (atoi)3.无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 //双指针滑动窗口数组hash int lengthOfLongestSubstring(char * s){int hash[127] {0}; //…

生产管理系统是什么?它有哪些功能模块?

阅读本文您将了解&#xff1a;1.企业生产管理的问题&#xff1b;2.生产管理系统模块有哪些&#xff1b;3.如何利用生产管理系统模块解决问题。 一、企业生产管理会遇到哪些问题&#xff1f; 生产管理是有计划、组织、指挥、监督调节的生产活动。以最少的资源损耗&#xff0c;…

Qt Quick - Menu

Qt Quick - Menu使用总结一、概述二、上下文菜单三、弹出式菜单四、子菜单和Action五、美化一、概述 Menu其实就是Qt Quick里面的菜单控件&#xff0c;一般来说。 Menu有两种主要用例: 上下文菜单&#xff1b;例如&#xff0c;右键单击后显示的菜单弹出菜单&#xff1b;例如…

高比例可再生能源电力系统的调峰成本量化与分摊模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

VSCode远程调试linux

文章目录前言1. 给从机安装GCC与GDB2. 编写测试 .c文件3. 本地编译生成可执行文件4. VSCode配置4.1 拓展安装4.2 ssh连接与配置4.3 配置debug5. 开启调试前言 这个调试是基于迅为itop3568板子进行调试的&#xff0c;如果你的不是这个板子&#xff0c;其实其他的也差不多流程。…

什么是瀑布流布局?瀑布流式布局的优缺点

瀑布流又称瀑布流式布局&#xff0c;是一种多列等宽不等高的一种页面布局方式。 视觉表现为参差不齐的多栏布局。随着页面滚动条向下滚动&#xff0c;这种布局会不断加载数据并附加至当前的尾部。 是一种多列等宽不等高的一种页面布局方式&#xff0c;用于图片比较复杂&#…