UDP数据包和TCP数据包的区别;网络编程套接字;不同协议的回显服务器
目录
一、UDP 数据包与 TCP 数据包的区别:
连接方面:
传输方面:
面向对象:
双工模式:
二、UDP 网络编程套接字;基于 UDP 协议的回显服务器:
1. UDP 数据报套接字核心类
DatagramSocket :
DatagramPacket :
2.基于 UDP 协议的回显服务器
服务器:
客户端:
继承 EchoServer 服务器的带有查询单词功能的服务器:
三、TCP 网络编程套接字;基于 TCP 协议的回显服务器:
1.TCP 数据报套接字核心类
ServerSocket:
Socket:
2.基于 TCP 协议的回显服务器
服务器:
客户端:
一、UDP 数据包与 TCP 数据包的区别:
连接方面:
UDP:是无连接协议。它不需要事先建立连接就可以直接发送数据,就像写信一样,直接把信寄出去,不需要先和对方打招呼说要寄信了。
TCP:是面向连接的协议。在数据传输之前,需要在发送端和接收端之间建立一条连接,就像打电话一样,先拨号建立连接,然后才能进行数据传输。这个连接建立的过程通过三次握手来完成,确保双方都做好了数据传输的准备。
类比示例:
UDP: 就像发短信直接发送,无需确认对方是否在线。
TCP: 就像打电话一样,需要先拨号接通后,再通话。
传输方面:
UDP:是不可靠传输。UDP 不确保数据一定能到达接收端,也不确保数据的顺序和完整性,它只是将数据包发送出去,不关心是否被成功接收。
TCP:是可靠传输。他通过确认机制、重传机制等保证数据能够u准确无误地到达接收端。如果数据包在传输过程中丢失或损坏,TCP 会自动重传,确保数据的完整性和顺序性。
使用示例:
UDP:直播和在线大型游戏大多数都是用了 UDP 数据包协议,允许少量丢包,或者但要求低延迟。
TCP:文件传输必须确保每个字节正确到达。
面向对象:
UDP:面向数据报,数据以独立数据包为单位传输,每个包有明确的边界,且接收方一次读取一个完整的数据包。
TCP:面向字节流。他把引用程序交下来的数据看成是一连串的无结构的字节流,就像流水一样,TCP 会按照顺序将这些字节流发送出去,并在接收端按照同样的顺序还原。
双工模式:
UDP:支持全双工通信。同一时间内,数据在两个方向上进行运输,发送端和接收端可以同时发送和接收 UDP 数据包。
TCP:支持全双工通信。在同一连接中,数据可以同时在两个方向上进行传输,即发送端和接收端可以同时发送和接收数据,就像两个人同时打电话,双方都可以说话和倾听。
二、UDP 网络编程套接字;基于 UDP 协议的回显服务器:
1. UDP 数据报套接字核心类
DatagramSocket :
这个类用于发送和接收 UDP 数据报的套接字。(类似于车辆,负责发送和接收数据报)
DatagramSocket 构造方法:
方法签名 | 参数说明 | 用途 |
DatagramSocket( ) | 无参数 | 绑定到本机的任意一个随机端口(一般用于客户端) |
DatagramSocket(int port ) | port : 绑定的端口号 | 绑定到本机指定的端口(一般用于服务端) |
DatagramSocket 实例方法:
方法 | 参数说明 | 用途 |
receive( DatagramPacket p ) | p : 接收数据包的容器 | 用于接收数据报(如果没有接收到数据报,该方法会阻塞等待) |
send( DatagramPacket p ) | p : 要发送的数据包 | 用于发送数据包(不会阻塞等待,直接发送 UDP 数据报) |
close( ) | 无 | 关闭数据报套接字 |
DatagramPacket :
这个类用于封装 UDP 数据报的容器。(类似于车辆上的包裹,负责存储要运输的数据包)
DatagramPacket 构造方法:(接收用)
DatagramPacket(byte[] buf,int length)
构造一个 DatagramPacket 以用于接收数据报,接收的数据保存在一个字节数组 buf 中,和最多接收的字节数 length 。
DatagramPacket 构造方法:(发送用)
//第一种
DatagramPacket(byte[] buf,int offset,int length,InetAddress address, int port)//第二种
DatagramPacket(byte[] buf,int offset,int length,SocketAddress address)
构造一个 DatagramPacket 以用于发送数据报,要发送数据在字节数组 buf 中,从 偏移量 offset 开始,发送 length 个长度。
InetAddress 是一个具体类,可以直接实例化。SocketAddress 是一个抽象类,不能直接实例化,需要借助它的具体子类( InetSocketAddress
)来创建对象。
第一种方法的 address 可以这么构造:
InetAddress address = InetAddress.getByName("目标地址");
第二种方法的 address 可以这么构造:
SocketAddress socketAddress = new InetSocketAddress("目标地址", 端口号);
DatagramPacket 实例方法:
方法 | 说明 |
getAddress( ) | 从接收的数据报中,获取发送端主机的 ip 地址;或从发送的数据报中,获取接收端主机IP地址 |
getPort ( ) | 从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号 |
getSocketAddress ( ) | 获取发送方或接收方的套接字地址,返回一个 SocketAddress 对象(上面的DatagramPacket 构造方法:(发送用)有一个参数SocketAddress address 就是这个,DatagramPacket.getSocketAddress() 方法能够获取到包含 IP 地址和端口号的信息) |
2.基于 UDP 协议的回显服务器
服务器:
public class EchoServer {//创建 socket 对象private DatagramSocket socket;//构造方法public EchoServer(int port) throws SocketException {socket = new DatagramSocket(port);}//启动服务器,完成主要的业务逻辑public void start() throws IOException {System.out.println();System.out.println("服务器启动!");//服务器24小时不间断的服务while(true) {//一、读取请求并解析//1.创建一个空白的 DatagramPacket 对象DatagramPacket reqPacket = new DatagramPacket(new byte[4096],4096);//2.通过 receive 读取网卡的数据,如果网卡没有收到数据,就会阻塞等待。socket.receive(reqPacket);//3.把 DatagramPacket 中的数据解析成字符串,只需要从 DatagramPacket 取到有效的数据即可。String request = new String(reqPacket.getData(),0,reqPacket.getLength());//二、根据请求计算响应String response = process(request);//三、把响应写回到客户端//1.把响应构造成 DatagramPacket 对象DatagramPacket resPacket = new DatagramPacket(response.getBytes(),response.getBytes().length,//获取到发送方的 IP 地址和端口号reqPacket.getSocketAddress());//2.把 DatagramPacket 写回到客户端。socket.send(resPacket);//四、打印日志System.out.printf("[%s:%d] req:%s, resp:%s\n",reqPacket.getAddress(), reqPacket.getPort(), request, response);}}//由于这里实现的是 “ 回显服务器 ” ,所以响应和请求是一样的,这里直接返回请求即可。private String process(String request) {return request;}//启动服务器public static void main(String[] args) throws IOException {EchoServer server = new EchoServer(9090);server.start();}}
所以可以看到服务器处理的基本流程是:先构造一个 DatagramSocker 对象实例用于发送数据包。DatagramSocker 读取请求之前先构造一个用于读取数据报的 DatagramPacket 对象,经过处理后,再新构造一个用于发送数据报的 DatagramPacket 对象,再通过 DatagramSocker 对象实例发送数据包。
客户端:
public class EchoClient {private DatagramSocket socket = null;private String serverIp;private int serverPort;// 初始化服务器的 ip 和 服务器的端⼝.public EchoClient(String serverIp, int serverPort) throws SocketException {this.serverIp = serverIp;this.serverPort = serverPort;// 这个 new 操作, 就不再指定客户端的端⼝了. 让系统⾃动分配⼀个空闲端⼝.socket = new DatagramSocket();}public void start() throws IOException {Scanner scanner = new Scanner(System.in);System.out.println("客户端启动!");while(true) {//一、从控制台读取用户输入的内容System.out.print("> ");String request = scanner.next();//二、构造成 UDP 请求,并发送,不光要填内容, 还要填服务器的地址和端口.DatagramPacket reqPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,//要发送的服务器的 ip 和 端口InetAddress.getByName(serverIp),serverPort);socket.send(reqPacket);//三、读取服务器的响应。DatagramPacket respPacket = new DatagramPacket(new byte[4096],4096);socket.receive(respPacket);String response = new String(respPacket.getData(), 0, respPacket.getLength());//四、把响应显示到控制台。System.out.println(response);}}public static void main(String[] args) throws IOException {EchoClient echoClient = new EchoClient("127.0.0.1",9090);echoClient.start();}
}
所以可以看到客户端基本流程是:先构造一个 DatagramSocker 对象实例用于发送数据包。DatagramSocker 发送请求之前先构造一个用于发送数据报的 DatagramPacket 对象,经过服务器处理后,客户端读取返回结果之前,再新构造一个用于读取数据报的 DatagramPacket 对象,处理结果后打印在控制台上。
继承 EchoServer 服务器的带有查询单词功能的服务器:
//继承 EchoServer 类
public class DictServer extends EchoServer{//使用哈希表,查询更快private Map<String,String> map = new HashMap<>();public DictServer(int port) throws SocketException {super(port);map.put("cat", "小猫");map.put("dog", "小狗");map.put("pig", "小猪");map.put("bird", "小鸟");map.put("sheep", "小羊");map.put("cow", "小牛");map.put("chicken", "小鸡");map.put("rabbit", "小兔子");map.put("fish", "小鱼");map.put("wolf", "狼");map.put("monkey", "猴子");map.put("tiger", "老虎");map.put("lion", "狮子");//......}//重写父类的 process 方法@Overridepublic String process(String request) {return map.getOrDefault(request,"没有查到该单词!");}public static void main(String[] args) throws IOException {EchoServer server = new DictServer(9090);server.start();}
}
通过继承 EchoServer 这个类后,调用 process 方法会使用子类也就是 DictServer 这个类重写的 process 方法。
要注意的是, DictServer 继承 EchoServer 这个类 ,重写 process 方法之前,要把EchoServer 这个类process 这个方法改成 公有的方法(public)。
三、TCP 网络编程套接字;基于 TCP 协议的回显服务器:
1.TCP 数据报套接字核心类
ServerSocket:
ServerSocke 类是专门给服务器用的。它的主要作用是监听指定端口,等待客户端的连接请求。一旦有客户端连接,就会创建一个新的 Socket
对象来与客户端进行通信。
ServerSocket 构造方法:
ServerSocket serverscoket = new ServerSocket(int port);
port 是服务器的端口号。
ServerSocket 实例方法:
accept() | 监听并接受到此套接字的连接。该方法会阻塞,直到有客户端连接进来,然后返回一个 Socket 对象,用于与客户端进行通信。 |
close() | 关闭此服务器套接字。 |
Socket:
Socket 类用于表示客户端套接字,也就是和服务器建立连接后客户端用来与服务器进行通信的对象。它可以实现与服务器之间的数据读写操作。
Socket 构造方法:
Socket socket = new Socket(String IP,int port);
创建一个流套接字并将其连接到指定主机上的指定端口号。IP 是服务器的 IP 地址或主机名,port 是服务器监听的端口号。
Socket 实例方法:
getInputStream( ) | 返回此套接字的输入流,用于从服务器读取数据,返回流对象是InputStream |
getOutputStream( ) | 返回此套接字的输出流,用于向服务器发送数据,返回流对象是OutputStream |
2.基于 TCP 协议的回显服务器
服务器:
public class EchoServer {private ServerSocket serverSocket;public EchoServer(int port) throws IOException {//服务器启动,就会绑定到 port 端口上面。serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器上线!");while(true) {//接收一个客户端请求Socket socket = serverSocket.accept();//一个线程处理一个连接,这样服务器可以被多个客户端连接。Thread t = new Thread(() -> {this.processCoonection(socket);});t.start();}}//处理一个客户端/一个连接的逻辑.private void processCoonection(Socket socket) {System.out.printf("[%s:%d] 客户端上线!\n",socket.getInetAddress().toString(),socket.getPort());//实现通信的代码逻辑//获取与客户端连接的输入流和输出流try(InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream()) {//创建一个 Scanner 对象,用它从输入流 inputStream 读取客户端发送的请求数据Scanner scanner = new Scanner(inputStream);//创建一个 PrintWriter 对象,利用它把响应数据写入输出流 outputStreamPrintWriter writer = new PrintWriter(outputStream);while(true) {//一、读取请求并解析。if(!scanner.hasNext()) {// 针对客户端下线逻辑的处理. 如果客户端断开连接了 (比如客户端结束了)// 此时 hasNext 就会返回 falseSystem.out.printf("[%s:%d] 客户端下线!\n", socket.getInetAddress().toString(), socket.getPort());break;}String request = scanner.next();//二、根据请求计算响应。String response = process(request);//三、把响应写回客户端。writer.println(response);//刷新缓冲区writer.flush();System.out.printf("[%s:%d] req: %s; resp: %s\n", socket.getInetAddress().toString(), socket.getPort(), request, response);}} catch(IOException e) {e.printStackTrace();} finally {try {//防止文件资源泄露socket.close();} catch (IOException e) {throw new RuntimeException(e);}}}//这里由于是回显服务器,直接返回结果。private String process(String request) {return request;}public static void main(String[] args) throws IOException {EchoServer echoServer = new EchoServer(9090);echoServer.start();}
}
在上面的这段代码 this.processCoonection(socket); 要加上 this ,因为processCoonection方法是EchoServer 的一个实例方法,这意味着只有 EchoServer 类的对象实例才能调用这个方法。
而 this 在这里就起到了确定 “到底是哪个对象实例要调用 processCoonection 方法” 的作用。因为我们是在 EchoServer 类的一个实例方法 start 里面创建的这个线程,所以 this 指向的就是调用 start 方法的那个 EchoServer 对象实例(比如前面创建的 echoServer 实例)。
还有,这里涉及到了变量捕获, this.processCoonection(socket);里传入的 socket 。
当使用 Lambda 表达式或者匿名内部类时,如果在其内部引用了外部作用域的局部变量,就会发生变量捕获。被捕获的变量必须是 final 或者事实 final (即初始化后值不会再改变)。
每次循环都会创建一个新的 socket
对象。在 Lambda 表达式中使用 socket
时,实际上捕获了当前循环中 socket
变量的值。所以 Lambda 表达式需要捕获当前 socket
变量的值,以便在其执行时能够正确访问到对应的 socket
对象。
this
同样也被捕获了。在 Lambda 表达式中使用 this.processCoonection(socket);
,这里的 this
指向当前 EchoServer
类的实例。由于 Lambda 表达式会在新的线程中执行,为了在该线程中能够调用当前 EchoServer
实例的 processCoonection
方法,this
引用也被捕获了。
服务器这里要注意三个问题:
1、要使用 flush 方法刷新缓冲区。
Java 的输入输出操作里,缓冲区是系统为了提升数据读写效率而设立的一块内存区域。当程序向输出流写入数据时,数据不会马上被发送到目标设备(如网络另一端的服务器),而是先被存到缓冲区里。等缓冲区满了,或者满足特定条件时,系统才会把缓冲区里的数据一次性发送出去。同理,当从输入流读取数据时,数据会先被读到缓冲区,程序再从缓冲区读取。
所以,我们这个服务器数据比较少,数据会一直停留在缓冲区里,如果不刷新缓冲区,服务器可能无法及时收到数据,从而影响程序的正常交互。
2、要关闭 Socket 对象。
Socket 对象在使用过程中会占用系统的网络资源、文件描述符等。如果不关闭,这些资源就无法被释放,会导致资源泄漏。随着程序运行时间的增加,不断累积的资源泄漏可能会耗尽系统资源,影响系统的正常运行,甚至导致系统崩溃。
客户端:
public class EchoClient {private Socket socket;public EchoClient(String serverIP, int serverPort) throws IOException {// 在 new 这个对象的时候就涉及到 "建立连接操作"// 由于连接建立好了之后, 服务器的信息就在操作系统中被 TCP 协议记录了. 我们在应用程序层面上就不需要保存 IP 和 端口.socket = new Socket(serverIP,serverPort);}public void start() {System.out.println("客户端上线!");Scanner scanner = new Scanner(System.in);// //获取与服务器连接的输入流和输出流try(InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream()) {//创建一个 Scanner 对象,用它从输入流 inputStream 读取服务器返回的数据Scanner scannerNet = new Scanner(inputStream);//创建一个 PrintWriter 对象,利用它把请求数据发送给服务器PrintWriter writer = new PrintWriter(outputStream);while(true) {//一、从控制台读取用户的输入。System.out.print(">");String request = scanner.next();//二、构造请求发送给服务器writer.println(request);//刷新缓冲区writer.flush();//三、读取服务器的响应。if(!scannerNet.hasNext()) {System.out.println("服务器断开连接!");break;}String response = scannerNet.next();//四、把响应显示到控制台上System.out.println(response);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {EchoClient echoClient = new EchoClient("127.0.0.1",9090);echoClient.start();}
}
相关文章:
UDP数据包和TCP数据包的区别;网络编程套接字;不同协议的回显服务器
目录 一、UDP 数据包与 TCP 数据包的区别: 连接方面: 传输方面: 面向对象: 双工模式: 二、UDP 网络编程套接字;基于 UDP 协议的回显服务器: 1. UDP 数据报套接字核心类 DatagramSocket &…...
Python 应用异常追踪实战:如何集成 Sentry 进行高效错误监控
Python 应用异常追踪实战:如何集成 Sentry 进行高效错误监控 引言 在现代应用开发中,异常处理和错误监控至关重要。一个小的运行时错误可能会导致整个系统崩溃,而难以发现的逻辑漏洞可能长期影响用户体验。为了提升代码的稳定性,我们需要一个高效的异常监控机制,以便能够…...
【数据结构】--- 双向链表的增删查改
前言: 经过了几个月的漫长岁月,回头时年迈的小编发现,数据结构的内容还没有写博客,于是小编赶紧停下手头的活动,补上博客以洗清身上的罪孽 目录 前言: 概念: 双链表的初始化 双链表的判空 双链表…...
【C语言练习】014. 使用数组作为函数参数
014. 使用数组作为函数参数 014. 使用数组作为函数参数示例1:使用数组作为函数参数并修改数组元素函数定义输出结果 示例2:使用数组作为函数参数并计算数组的平均值函数定义输出结果 示例3:使用二维数组作为函数参数函数定义输出结果 示例4&a…...
本地服务器备份网站数据,本地服务器备份网站的操作步骤
本地服务器备份网站数据的完整操作指南 一、明确备份需求与目标 核心备份对象 网站文件: 上传的媒体文件(图片、视频、PDF等) 配置文件(如.htaccess、wp-config.php) 附加内容(根据需求选择ÿ…...
机器学习Day15 LightGBM算法
浅谈LightGBM算法:我们之前讲的集成学习算法分为三要素吧,就是形式,损失函数,优化方法,但是LightGBM算法并没有固定的形式,它主要是针对具体算法给出一些优化,它更像是前向分步算法一样,像一个框…...
算法查找目录
1. 基础数据结构 数组与链表 动态数组 实现与自动扩容机制均摊分析ArrayList/Vector实现 单向链表 基本操作(插入、删除、查找)链表反转环检测(Floyd判圈算法) 双向链表 插入删除操作优化双向遍历优势边界情况处理 循环链表 约瑟夫环问题单向循环链表双向循环链表 跳表 基本原…...
【HarmonyOS】作业三 UI
目录 一. 单选题(共10题,10分) 1. (单选题, 1分)关于Tabs组件页签的位置设置,下面描述错误的是 2. (单选题, 1分)下面哪个组件不能包含子组件? 3. (单选题, 1分)ArkTS语言的实现计数器功能的组件名称是以下哪个? 4. (单选题…...
2025五一杯数学建模B题:矿山数据处理问题,详细问题分析,思路模型
一、尊重原创:详细内容文末名片获取 二、数据文件解读 (一)数据文件 1:矿山监测一维数值样例数据.csv 想象一下,这就像是一本简单的记录册,里面记录着一组一维数值序列,每个数据点如同册子里的…...
ES6-Set-Map对象小记
Set 对象 添加元素 set.add(value)常用方法 方法描述has()判断 Set 对象中特定元素是否存在delete()从 Set 对象中删除指定元素clear()清空 Set 对象 遍历方法 很容易想到使用set.forEach(callBackFn, thisArg)方法来进行遍历,其中callBackFn回调的形式如下&am…...
WGCLOUD使用 - 如何监控RabbitMQ运行参数
WGCLOUD是一款开源免费的运维监控软件,开箱即用,实用轻量,高效简单。 RabbitMQ指标数据的采集工作是由server-backup来做的,所以我们需要部署server-backup,它是一个server的辅助工具,作用相当于agent Rabb…...
FreeSWITCH 发送 sip message 的 lua 程序
-- chat.lualocal from argv[1] local to argv[2] local body argv[3] local profile "internal" -- 改成自己的 sip_profileif not body thenstream:write("-ERR miss ie")return endlocal api freeswitch.API() local domain api:executeString(&q…...
安全学习基础入门5集
前言: 来源于b站小迪安全v2023第5天:基础入门-反弹SHELL&不回显带外&正反向连接&防火墙出入站&文件下载_哔哩哔哩_bilibili 环境准备: 通过网盘分享的文件:netcat-1.11 链接: https://pan.baidu.com/s/1zgyYvPf…...
Python结合QT进行开发
Python结合Qt进行开发指南 1. Qt for Python简介 Qt for Python(PySide/PyQt)是Python的官方Qt绑定,允许使用Python语言开发跨平台的GUI应用程序。PySide是Qt官方支持的Python绑定,而PyQt是Riverbank Computing提供的商业/开源版本。 主要特点: 跨平台支持(Windows/macOS…...
Python与深度学习:自动驾驶中的物体检测,如何让汽车“看懂”世界
Python与深度学习:自动驾驶中的物体检测,如何让汽车“看懂”世界 一、引言:自动驾驶的“眼睛”——物体检测 在自动驾驶技术的浪潮中,如何让汽车像人类一样“看懂”周围的环境,成为了最为关键的一环。汽车需要感知道路上的行人、障碍物、交通标志、其他车辆等信息,做出实…...
深度学习-神经网络参数优化的约束与迭代策略
文章目录 前言一、正则化惩罚1、权重正则化(Weight Regularization)2、结构正则化(Structural Regularization)3、其他正则化方法 二、梯度下降1、基本原理(1)梯度下降的计算(2) 算法…...
PyTorch 与 TensorFlow:深度学习框架的深度剖析与实战对比
PyTorch 与 TensorFlow:深度学习框架的深度剖析与实战对比 摘要 :本文深入对比 PyTorch 与 TensorFlow 两大深度学习框架,从核心架构、优缺点、适用场景等多维度剖析,结合实例讲解,帮助开发者清晰理解两者特性&#x…...
Meta公司于2025年4月29日正式推出了全新Meta AI应用程序的首个版本
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【数据结构】- 栈
前言: 经过了几个月的漫长岁月,回头时年迈的小编发现,数据结构的内容还没有写博客,于是小编赶紧停下手头的活动,补上博客以洗清身上的罪孽 目录 前言: 栈的应用 括号匹配 逆波兰表达式 数制转换 栈的实…...
MATLAB R2024a安装教程
安装步骤: 软件大小:约12.08G 安装环境:Win10~Win11或更高 下载好安装包,可以在网上找个安装包,比如我用国内镜像matlab地址github.com/futureflsl/matlab-chinese-mirror,这样下载稍微快点 1.开始安装…...
【Linux网络】I/O多路转接技术 - poll
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
24.Linux中RTC的驱动实验_csdn
这个在裸机开发也有,如果有过裸机开发经验的同学就比较入手了! 1、Linux 内核 RTC 驱动简介 2、STM32MP1 内部 RTC 驱动分析 像这里的读取时间,是在之前的代码里面已经写好了有关时间计数的代码,直接引用两个寄存器就行。 3、…...
C++负载均衡远程调用学习之TCP连接封装与TCPCLIENT封装
目录 1.LARSV0.3回顾 2.解决粘包问题的message结构体定义 3.LARSV0.4链接对象的方法和属性的定义 4.LARSv0.4 TCP_conn链接的初始化 5.LARV0.4-tcp_conn处理读事件方法do_read 6.LARV0.4-tcp_conn模块回顾 7.LARV0.4-tcp_send_message主动发包实现 8.LARV0.4-tcp_conn处…...
Python TensorFlow库【深度学习框架】全面讲解与案例
一、TensorFlow 基础知识 1. 核心概念 张量 (Tensor): 多维数组,是 TensorFlow 的基本数据单位(标量、向量、矩阵等)。计算图 (Graph): 早期版本中的静态图机制(TF2.x 默认启用动态图)。会话 (Session): 在 TF1.x 中…...
日志之ClickHouse部署及替换ELK中的Elasticsearch
文章目录 1 ELK替换1.1 Elasticsearch vs ClickHouse1.2 环境部署1.2.1 zookeeper 集群部署1.2.2 Kafka 集群部署1.2.3 FileBeat 部署1.2.4 clickhouse 部署1.2.4.1 准备步骤1.2.4.2 添加官方存储库1.2.4.3 部署&启动&连接1.2.4.5 基本配置服务1.2.4.6 测试创建数据库和…...
Git 基本操作(一)
目录 git add git commit git log git status git diff git 版本回退 git reset git add git add 指令为添加工作区中的文件到暂存区中。 git add file_name; //将工作区名称为file_name的文件添加进暂存区 git add .; //将工作区中的所有文件添加进暂存区 git comm…...
加密解密记录
一、RSA 加密解密 密钥对生成 1.前端加密解密 (1).vue页面引入 npm install jsencrypt(2)工具 jsencrypt.js import JSEncrypt from jsencrypt/bin/jsencrypt.min// 密钥对生成 http://web.chacuo.net/netrsakeypairconst p…...
Playwright MCP 入门实战:自动化测试与 Copilot 集成指南
什么是 MCP? MCP(Model Context Protocol) 是一种为大语言模型(LLM)设计的协议,MCP充当 LLM 与实际应用之间的桥梁或“翻译器”,将自然语言转化为结构化指令,使得模型可以更精确、高…...
存算一体架构下的新型AI加速范式:从Samsung HBM-PIM看近内存计算趋势
引言:突破"内存墙"的物理革命 冯诺依曼架构的"存储-计算分离"设计正面临根本性挑战——在GPT-4等万亿参数模型中,数据搬运能耗已达计算本身的200倍。存算一体(Processing-In-Memory, PIM)技术通过在存储介…...
为 Unity 项目添加自定义 USB HID 设备支持 (适用于 PC 和 Android/VR)-任何手柄、无人机手柄、摇杆、方向盘
这是一份关于如何在 Unity 中为特定 USB HID 设备(如 Phoenix SM600 手柄)添加支持,并确保其在打包成 APK 安装到独立 VR 设备后仍能正常工作的教程。 目标: 使 Unity 能够识别并处理特定 USB HID(Human Interface Device&#x…...
恒流源电路
常见的是上面这几种, 运放恒流电路一般搭配三极管使用 比赛用的模块可以用这种,会准一点...
python2反编译部分
文章目录 1、所需环境2、确认打包工具(没成功)3、 解包.exe文件(以PyInstaller为例) - useful【***总的来说这一步对我有用】4、定位关键文件 - useful5、 修复.pyc文件头(关键步骤!)- maybe-ig…...
Selenium3自动化测试,Python3测试开发教程视频测试用例设计
Selenium3自动化测试,Python3测试开发教程视频测试用例设计25套高级软件测试,性能测试,功能测试,自动化测试,接口测试,移动端测试,手机测试,WEB测试,渗透测试,…...
PyTorch 2.0编译器技术深度解析:如何自动生成高性能CUDA代码
引言:编译革命的范式转移 PyTorch 2.0的torch.compile不仅是简单的即时编译器(JIT),更标志着深度学习框架从解释执行到编译优化的范式跃迁。本文通过逆向工程编译过程,揭示PyTorch如何将动态图转换为高性能CU…...
ctfshow web入门 web44
信息收集 依旧是把所有输出丢弃,这一次多了flag的过滤,没啥好说的,用*或者?代替就可以了 if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/;|cat|flag/i", $c)){system($c." >/dev/null 2>&1");} }else{h…...
三生原理的离散生成逻辑如何与复分析结合?
AI辅助创作: 三生原理离散生成逻辑与复分析结合路径分析 一、生成规则与解析延拓的协同 参数化联动机制向复数域延伸 三生原理的离散素数生成公式(如p=3(2n+1)+2(2n+m+1))通过引入复数参数 n,m∈C,可扩展为复平面上的解析函数,从而建立与黎曼ζ函数的关联通道。…...
数据升降级:医疗数据的“时空穿梭“系统工程(分析与架构篇)
一、核心挑战与量化分析 1. 版本演化困境的深度解析 (1) 格式断层的结构化危机 数据转换黑洞:某医疗信息平台(2021-2023)统计显示: 数据类型CDA R1→R2转换失败率R2→FHIR转换失败率关键失败点诊断记录28.4%19.7%ICD编码版本冲突(18.7%)用药记录15.2%12.3%剂量单位标准化…...
简单句练习--语法基础
文章目录 谓语和非谓语及物与不及物动词及物不及物主语必须由名词性质的成分充当谓语和非谓语 与中文不同,英语中的动词分为谓语形式和非谓语形式。 以“do”为例, 可以充当谓语的形式有:do,does,did, 以及其他各种时态,如:have done,is doing等。不可独立充当谓语的有…...
基于若依RuoYi-Vue3-FastAPI 的 Docker 部署记录
最近在参与导师项目开发过程中,我选择基于若依 FastAPI Vue3 模板作为系统框架,通过 Docker 实现前后端、数据库和缓存环境的容器化部署。 RuoYi-Vue3-FastAPI的github地址:https://github.com/insistence/RuoYi-Vue3-FastAPI 🛠…...
基于开源AI智能名片链动2+1模式S2B2C商城小程序的电商直播流量转化路径研究
摘要:在电商直播单场GMV突破2.28亿元的流量狂欢背后,传统直播模式正面临"流量过载而转化低效"的困境。本文提出以开源AI智能名片链动21模式S2B2C商城小程序重构流量转化路径,通过智能内容引擎、动态激励体系、供应链协同三大技术模…...
【Linux系统】Linux进程信号(产生,保存信号)
1. 信号快速认识 1-1 基本结论 如何识别信号?识别信号是内置的,进程识别信号,是内核程序员写的内置特性。信号产生之后,是知道怎么处理的,同理,如果信号没有产生,也是知道怎么处理信号的。所以…...
llamafactory-cli webui启动报错TypeError: argument of type ‘bool‘ is not iterable
一、问题 在阿里云NoteBook上启动llamafactory-cli webui报错TypeError: argument of type ‘bool’ is not iterable This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run gradio deploy from the terminal in the working directory t…...
工 厂 模 式
冷知识,当我们需要使用平底锅时,我们并不需要知道平底锅是怎么造的,坏了只需要再买就好了。至于造平底锅,全部交给我们的生产工厂就好。 蕴含这种创建对象思路的设计方法,我们称为“工厂模式”。 核心思想 工厂模式&…...
synchronized与Lock深度对比
Java并发编程:synchronized与Lock深度对比 基本概念 1.1 synchronized synchronized是Java内置的关键字,属于JVM层面的锁机制。它通过对象监视器(Monitor)实现同步,具有自动获取和释放锁的特性。 // 同步方法 public synchronized void sy…...
LeetCode —— 94. 二叉树的中序遍历
94. 二叉树的中序遍历 题目:94. 二叉树的中序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) :…...
【无标题】四色拓扑收缩模型中环形套嵌结构的颜色保真确定方法
#### **1. 环形嵌套结构的局部保真机制** - **零点虚边与环形嵌套**:在顶点 \( v \) 处引入环形嵌套结构(如环面 \( T^2 \)),通过虚边连接形成闭合路径。该结构作为“颜色记忆单元”,存储相邻区域的色彩信息࿰…...
Curl 全面使用指南
Curl(Client URL)是一个跨平台命令行工具,支持多种协议(HTTP/HTTPS/FTP/SFTP等),用于数据传输、API调试、文件上传/下载等场景。以下从 核心功能、用户疑问解答、高级技巧 三方面系统总结,并整合…...
vscode 的空格和 tab 设置 与 Rime 自建词库
自动保存(多用于失去焦点时保存) Files: Auto Save 推荐不勾 保存时格式化(Pritter 插件的功能,自动使用 Pritter 的格式) Editor: Format On Save 推荐不勾 tab 的空格数量,2 或 4 Editor: Tab Size 推荐…...
Spark-小练试刀
任务1:HDFS上有三份文件,分别为student.txt(学生信息表)result_bigdata.txt(大数据基础成绩表), result_math.txt(数学成绩表)。 加载student.txt为名称为student的RDD…...
Python爬虫实战:获取jd商城最新5060ti 16g显卡销量排行榜商品数据并做分析,为显卡选购做参考
一、引言 1.1 研究目的 本研究旨在利用 Python 爬虫技术,从京东商城获取 “5060ti 16g” 型号显卡的商品数据,并对这些数据进行深入分析。具体目标包括: 实现京东商城的模拟登录,突破登录验证机制,获取登录后的访问权限。高效稳定地爬取按销量排名前 20 的 “5060ti 16g…...