UDP套接字

news/2024/5/4 14:46:50/文章来源:https://blog.csdn.net/weixin_61436104/article/details/130034619

大家好,又见面了,🎉🎉🎉🌸🌸🌸
今天为大家带来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);//为了方便处理这个请求,将数据包转为StringString 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.luyixian.cn/news_show_283720.aspx

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

相关文章

腾讯空降测试工程师,绩效次次拿S,真是砂纸擦屁股,给我露了一手啊

​上周我们公司的绩效面谈全部结束了,每年到这个时间点就是打绩效的时候了,对于职场打工人来说绩效绝对是最重要的事情之一,原因也很简单:奖金、晋升、涨薪都和它有关系。 比如下面这个美团员工在脉脉上的自曝就很凄凉&#xff1…

多种方法解决VS在创建多个源文件后运行时出现的重定义错误:main已经在1.obj中定义

名人说:博学之,审问之,慎思之,明辨之,笃行之。——《中庸》 创作者:Code_流苏(CSDN) 本篇文章收录于:各类问题记录专栏 记录一、原因经过二、解决方法1️⃣方法一 注释2️⃣方法二 生成排除3️⃣…

学习Python的一些知识点记录

一、对象比较 Python中有两种对象比较方式&#xff1a; 值比较。使用比较符号&#xff08;、>、<等&#xff09;标识符比较。使用 is、not 关键字。标识符就是对象在内存中的有效地址&#xff0c;使用 id() 函数可以得到对象的标识符。二、None 对象 这是一个特殊对象…

【Python】数学 - 用 Python 自动化求解函数 f(x) 的值

目录 1、缘起 2、求以下函数的值 3、代码清单 3.1、求解 f(0)、f(1)、 f(​编辑)、f(​编辑) 3.2、求解 g(0)、g(1)、g(​编辑)、g(​编辑) 3.3、求解 h(0)、h(1)、h(​编辑)、h(​编辑) 4、总结 1、缘起 Python 是一种强大的编程语言&#xff0c;它具有广泛的应用领域。…

四、第二阶段

全局数据 声明 # < lib_arm\board.c > DECLARE_GLOBAL_DATA_PTR; 定义 # < include\asm\global_data.h > typedef struct global_data { bd_t *bd; unsigned long flags; unsigned long baudrate; unsigned long have_console; /* serial_init() was calle…

使用adb 命令删除手机预装app

1. 手机开启开发者选项&#xff0c;允许usb调试&#xff1b; 2.pc 安装adb&#xff0c; 1&#xff09;Windows版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-windows.zip 2&#xff09;按键windowsr打开运行&#xff0c;输入sysdm.cpl&a…

Go 语言安装部署,两分钟让你写`上Hello World`(包含 goland 开发工具)

Go 语言安装部署&#xff0c;两分钟让你写上Hello World&#xff08;包含 goland 开发工具&#xff09; 第一步下载 Go 安装包 官网 https://golang.google.cn/dl/ 根据自己使用电脑平台选择安装版本 第二步 安装 GO 打开安装包直接点击next下一步 勾选协议&#xff0c;继…

10 kafka生产者发送消息的原理

1.发送原理&#xff1a; 在消息发送的过程中&#xff0c;涉及到了两个线程——main 线程和 Sender 线程。在 main 线程 中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator&#xff0c; Sender 线程不断从 RecordAccumulator 中拉取消息发送到…

CTFHub | 00截断

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

IDEA修改主题 设置背景图片

IDEA修改主题 设置背景图片 目录IDEA修改主题 设置背景图片1.修改IDEA默认主题2.修改IDEA背景图片2.1 打开设置界面2.2 下载插件很多小白在刚刚使用IDEA的时候还不是很熟练本文主要给大家提供一些使用的小技巧&#xff0c;希望能帮助到你1.修改IDEA默认主题 IDEA的默认主题是黑…

Jmeter 工具测试 websocket

WebSocket 是一种基于在单个 TCP 连接上进行全双工通信的协议&#xff0c;是从HTML5开始提供的一种浏览器与服务器之间进行全双工通讯的网络技术。相较于 HTTP 协议&#xff0c;WebSocket 协议实现了持久化网络通信&#xff0c;可以实现客户端和服务端的长连接&#xff0c;能够…

对Javascript中作用域的理解?

一、作用域 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性 举个例子 function myFunction() {let inVariable "…

C/C++中文参考手册离线最新版

最近又用回C/C刷题&#xff0c;回想上一年还在用Java&#xff0c;C/C才是世界上最好的语言&#xff08;纯属调侃&#xff09;。哼哼&#xff0c;不许反驳。 想分享我正在使用的C/C中文参考手册离线最新版给大家&#xff0c;需要的朋友们可以自行下载&#xff08;free的哦&#…

造型别致的耳夹式耳机,听出新色彩,塞那Z50上手

蓝牙耳机这几年发展很快&#xff0c;市面上的选择特别丰富&#xff0c;其中还有不少设计、音质都特别出彩的产品&#xff0c;像是我最近在用的这款sanag塞那Z50&#xff0c;就采用了一种很新颖的设计&#xff0c;带来了更加舒适的佩戴体验&#xff0c;而且音质表现也很出色。 s…

Redis 如何使用 Sentinel 构建主从复制的高可用架构?

文章目录Redis 如何使用 Sentinel 构建主从复制的高可用架构&#xff1f;什么是 Sentinel 服务&#xff1f;如何配置 Sentinel 集群服务&#xff1f;启动 Sentinel 服务配置说明测试主节点失效查看 Sentinel 主节点服务状态查看 Sentinel 从节点服务状态模拟主节点失效观察各个…

Unity实战篇 | 使Unity打包的exe程序始终保持屏幕最前端【文末送书】

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…

Winform控件开发(28)——ToolTip(史上最全)

前言: 该控件的作用是在鼠标移动到控件上方时,弹出一个提示框,效果如下: 利用方法SetToolTip将工具提示和控件绑定 toolTip1.SetToolTip(button1 ,"提示1");一、属性 1、Name 获取控件对象 2、Active 为true时,工具提示才有效 3、AutomaticDelay 设置该…

第一章:part1监督学习:回归

线性回归&#xff08;linear regression model&#xff09; 线性回归模型 回归&#xff1a;可以预测数字作为输出 是一种特殊的监督学习模型 例&#xff1a;通过已知的房价来拟合曲线 可以求得英尺的价格 区别回归与分类&#xff1a;分类的输出结果一般为离散的&#xff0c;并…

Python第二章---列表简介

1、列表是什么&#xff1f; 在Python中用 [ ] 表示列表&#xff0c;用 逗号 , 分隔元素 每个元素用对应类型的方法标注&#xff0c;如字符串类型用单引号‘ ’标注 形如 list1 [a,b,c] print(list1); 输出时&#xff0c;会打印全部内容&#xff0c;包括符号 访问列表元…

Linux系统操作命令

1.linux目录结构 不同于 Windows 系统的⽂件路径的起点是盘符, Linux 系统的路径起点是/(根⽬录) 注意: - 1. / 为根⽬录, 是所有⽂件的路径的起点 - 2. 根⽬录下的所有第⼀层级的⽂件夹, 均不能随意进⾏修改操作 - 3. 掌握常⽤⽬录的作⽤即可 - 4. / 根⽬录, /home 普通⽤户…