当前位置: 首页 > news >正文

UDP数据报和TCP流套接字编程

文章目录

    • UDP数据报套接字编程
      • 1.DatagramSocket类
      • 2.DatagramPacket类
      • 3. InetSocketAddress类
      • 构建服务端和客户端
    • TCP流套接字编程
      • 1. ServerSocket类
      • 2.Socket类
      • 构建服务端和客户端
    • 扩展
      • 对话形式
      • 简易的字典
      • 多线程实现
      • 线程池实现

UDP数据报套接字编程

1.DatagramSocket类

DatagramSocket 是UDP Socket,⽤于发送和接收UDP数据报。
DatagramSocket构造方法:
DatagramSocket():创建⼀个UDP数据报套接字的Socket,绑定到本机任意⼀个随机端⼝(⼀般⽤于客户端)
DatagramSocket(int port):创建⼀个UDP数据报套接字的Socket,绑定到本机指定的端⼝(⼀般⽤于服务端)
DatagramSocket方法:
void receive(DatagramPacket p):
从此套接字接收数据报(如果没有接收到数据报,该⽅法会阻塞等待)
void send(DatagramPacket p):从此套接字发送数据报(不会阻塞等待,直接发送)
void close():关闭此数据报

2.DatagramPacket类

DatagramPacket构造方法:
DatagramPacket(byte[] buf, int length):
构造⼀个DatagramPacket以⽤来接收数据报,接收的数据保存在字节数组(第⼀个参数buf)中,接收指定⻓度(第⼆个参数length)

DatagramPacket(byte[] buf, int offset, int length,SocketAddress address):构造⼀个DatagramPacket以⽤来发送数据报,发送的
数据为字节数组(第⼀个参数buf)中,从0到指定⻓度(第⼆个参数length)。address指定⽬的主机的IP和端⼝号

DatagramPacket方法:
InetAddress getAddress():从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取接收端主机IP地址
int getPort():从接收的数据报中,获取发送端主机的端⼝号;或从发送的数据报中,获取接收端主机端⼝号
byte[] getData():获取数据报中的数据

3. InetSocketAddress类

构造UDP发送的数据报时,需要传⼊ SocketAddress ,该对象可以使⽤ InetSocketAddress来创建。
InetSocketAddress ( SocketAddress 的⼦类 )构造⽅法:
InetSocketAddress(InetAddress addr, int port):创建一个Socket地址,包含IP地址和端口号

构建服务端和客户端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;public class UDPEchosever {//创建服务端DatagramSocket socket;public UDPEchosever(int post) throws SocketException {if(post<1024||post>65535){throw new RuntimeException("端口号不符合条件");}socket=new DatagramSocket(post);}public void start() throws IOException {System.out.println("服务器已启动");while (true){//接收用户发来的数据DatagramPacket requestPacket = new DatagramPacket(new byte[1024], 1024);// 2. 接收数据socket.receive(requestPacket);// 3. 解析接收到的数据String request = new String(requestPacket.getData(), 0,requestPacket.getLength(), "UTF-8");//接收响应String respose=count(request);//发送响应DatagramPacket resposeSock=new DatagramPacket(respose.getBytes(StandardCharsets.UTF_8),0,respose.length(),requestPacket.getSocketAddress());socket.send(resposeSock);System.out.printf("[%s:%d] request :%s,response=%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,respose);}}public String count(String request){return request;}public static void main(String[] args) throws IOException {UDPEchosever udpEchosever=new UDPEchosever(8888);udpEchosever.start();}
}
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;public class UDPEchoclient {//创建客户端DatagramSocket socket;//定义端口号,IP地址String IP;int port;public UDPEchoclient (String IP,int port) throws SocketException {this.socket=new DatagramSocket();this.IP=IP;this.port=port;}public void start() throws IOException {System.out.println("客服端已启动");while (true){System.out.println("->");//发送内容Scanner scanner=new Scanner(System.in);String request=scanner.nextLine();if(request==null||request.isEmpty()){System.out.println("字符串不能为空");}//包装用户发送的内容//SocketAddress address = new InetSocketAddress(IP, port);DatagramPacket requestPacket = new DatagramPacket(request.getBytes(StandardCharsets.UTF_8),0, request.getBytes().length, new InetSocketAddress(IP, port));
//            DatagramPacket datagramPacket=new DatagramPacket(request.getBytes(StandardCharsets.UTF_8),0,request.length(),
//                    new InetSocketAddress(IP,port));socket.send(requestPacket);//用DatagramPacket接收服务器的响应数据DatagramPacket revicesocket=new DatagramPacket(new byte[1024],1024);socket.receive(revicesocket);//解析发送来的数据String respose=new String(revicesocket.getData(),0, revicesocket.getLength(),"UTF-8");System.out.printf("request:%s,repost:%s",request,respose);}}public static void main(String[] args) throws IOException {//System.out.println("你好");UDPEchoclient udpEchoclient=new UDPEchoclient("127.0.0.1",8888);udpEchoclient.start();}
}

在这里插入图片描述

TCP流套接字编程

1. ServerSocket类

ServerSocket 构造⽅法:
ServerSokcet(int port):创建⼀个服务端流套接字Socket,并绑定到指定端⼝
ServerSocket方法:
Socket accept():开始监听指定端⼝(创建时绑定的端⼝),有客⼾端连接后,返回⼀个服务端Socket对象,并基于该Socket建⽴与客⼾端的连接,否则阻塞等待
void close():关闭此套接字

2.Socket类

Socket 是客⼾端Socket,或服务端中接收到客⼾端建⽴连接(accept⽅法)的请求后,返回的服务端Socket。
不管是客⼾端还是服务端Socket,都是双⽅建⽴连接以后,保存的对端信息,及⽤来与对⽅收发数据的。
Socket的构造方法:
Socket(String host, int port):创建⼀个客⼾端流套接字Socket,并与对应IP的主机
上,对应端⼝的进程建⽴连接
Socket方法:
InetAddress getInetAddress() 返回套接字所连接的地址
InputStream getInputStream() 返回此套接字的输⼊流
OutputStream getOutputStream() 返回此套接字的输出流

构建服务端和客户端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class TCPEchoSever {ServerSocket socket;//定义客户端public TCPEchoSever(int pase) throws IOException {if(pase<1024||pase>65535){System.out.println("端口号不符合条件");}this.socket=new ServerSocket(pase);}public void start() throws IOException {System.out.println("服务器已启动,等待客服端连接");//循环接收连接需求while (true){Socket clientsocket=socket.accept();//创建一个方法去接收客服端的内容reviceports(clientsocket);}}public void reviceports(Socket clientsocket) throws IOException {System.out.printf("[%s %d] 客服端上线了\n",clientsocket.getInetAddress().toString(),clientsocket.getPort());//使用输出流和输入流进行接收try(InputStream inputStream= clientsocket.getInputStream();OutputStream outputStream= clientsocket.getOutputStream()){while (true) {Scanner scanner = new Scanner(inputStream);//嵌入输入流if (!scanner.hasNextLine()) {System.out.printf("[%s %d] 客服端下线了",clientsocket.getInetAddress().toString(),clientsocket.getPort());break;}//获取用户发来的内容String request = scanner.nextLine();//对内容进行计算响应String respose = Calculation(request);//把响应写入输出流PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println(respose);//刷新缓冲区printWriter.flush();//打印System.out.printf("[%s:%d] request=%s,respose=%s\n", clientsocket.getInetAddress().toString(), clientsocket.getPort(), request, respose);}}}protected String Calculation(String respose){return respose;}public static void main(String[] args) throws IOException {TCPEchoSever tcpEchoSever=new TCPEchoSever(8888);tcpEchoSever.start();}
}
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 {//创建客服端Socket socket;String IP;int port;public TCPEchoClient(String IP, int port) throws IOException {if (IP == null || IP.isEmpty()) {throw new RuntimeException("IP不能为空");}if (port < 1024 || port > 65535) {throw new RuntimeException("端口号不符合要求");}socket = new Socket(IP, port);}public void start() {System.out.println("客服端已启动");try (InputStream inputStream = this.socket.getInputStream();OutputStream outputStream = this.socket.getOutputStream()) {while (true) {Scanner scanner = new Scanner(System.in);String request = scanner.nextLine();if (request.isEmpty() || request == null) {System.out.println("发送内容不能为空");}PrintWriter printWriter = new PrintWriter(outputStream);//把数据写入输出流printWriter.println(request);printWriter.flush();//接收服务端发送来的数据Scanner scan = new Scanner(inputStream);String respose = scan.nextLine();System.out.println("request:" + request + "repose:" + respose);}} catch (IOException e) {throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {TCPEchoClient tcpEchoClient=new TCPEchoClient("127.0.0.1",8888);tcpEchoClient.start();}
}

扩展

连接的端口号自定义在1024-65535间,自己定义统一就行,都是在服务端修改,客服端不发生修改

对话形式

import java.io.IOException;
import java.util.Scanner;public class TCPEchoexchange extends TCPEchoSever {public TCPEchoexchange(int pase) throws IOException {super(pase);}@Overrideprotected String Calculation(String request) {//打印发送来的内容System.out.println(request);System.out.println("请用户输入回应内容");while (true){Scanner scanner=new Scanner(System.in);String respose=scanner.nextLine();if(respose==null||respose.isEmpty()){System.out.println("输入内容不能为空");}return respose;}}public static void main(String[] args) throws IOException {TCPEchoexchange tcpEchoexchange=new TCPEchoexchange(6666);tcpEchoexchange.start();}
}

简易的字典

import java.io.IOException;
import java.util.HashMap;public class TCPEchoMapsever  extends TCPEchoSever{HashMap<String,String> map;public TCPEchoMapsever(int pase) throws IOException {super(pase);map=new HashMap<>();map.put("狗","dog");map.put("猫","cat");map.put("鸡","chicken");map.put("猪","pig");}@Overrideprotected String Calculation(String request) {String key= map.getOrDefault(request,"没有找到");return key;}public static void main(String[] args) throws IOException {TCPEchoMapsever tcpEchoMapsever=new TCPEchoMapsever(8888);tcpEchoMapsever.start();}
}

多线程实现

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 TCPchoThread extends TCPEchoSever{public TCPchoThread(int pase) throws IOException {super(pase);}@Overridepublic void start() throws IOException {System.out.println("服务端已启动");while (true){Socket client=socket.accept();Thread th = new Thread (()->{try {reviceports(client);} catch (IOException e) {throw new RuntimeException(e);}});th.start();}}public static void main(String[] args) throws IOException {TCPchoThread tcPchoThread=new TCPchoThread(9999);tcPchoThread.start();}

线程池实现

import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TCPEchoPoolthread extends TCPEchoSever {public TCPEchoPoolthread(int pase) throws IOException {super(pase);}@Overridepublic void start() throws IOException {ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(4,10,1,TimeUnit.SECONDS,new ArrayBlockingQueue<>(2));System.out.println("服务端已启动,等待客服端连接");while (true){Socket client=socket.accept();threadPoolExecutor.submit(()->{try {reviceports(client);} catch (IOException e) {throw new RuntimeException(e);}});}}public static void main(String[] args) throws IOException {TCPEchoPoolthread tcpEchoPoolthread=new TCPEchoPoolthread(7777);tcpEchoPoolthread.start();}
}

相关文章:

UDP数据报和TCP流套接字编程

文章目录 UDP数据报套接字编程1.DatagramSocket类2.DatagramPacket类3. InetSocketAddress类构建服务端和客户端 TCP流套接字编程1. ServerSocket类2.Socket类构建服务端和客户端 扩展对话形式简易的字典多线程实现线程池实现 UDP数据报套接字编程 1.DatagramSocket类 Datagr…...

某建筑石料用灰岩矿自动化监测

1. 项目简介 某建材有限公司成立于2012年&#xff0c;是一家集矿山开采、石料生产及销售为一体的建筑材料生产企业&#xff0c;拥有两条年产500万吨的环保型精品骨料生产线&#xff0c;各类工程机械 30 多台套&#xff0c;运输车辆50多辆。公司坚持生态优先&#xff0c;以高质…...

C++11 的编译器支持

C11 主要功能特性一览 特性描述提案GCCClangMSVCApple ClangEDG eccpIntel CNvidia HPC C (ex PGI)*Nvidia nvccCrayEmbarcadero C BuilderIBM Open XL C for AIXIBM Open XL C for z/OSIBM XL CSun/Oracle CHP aCCDigital Mars C核心功能右值引用 (T&&)支持移动语义和…...

20250429 垂直地表发射激光测量偏转可以验证相对性原理吗

垂直地表发射激光测量偏转可以验证相对性原理吗 垂直地表发射激光测量偏转可以在一定条件下用于检验广义相对论中的等效原理和引力对光传播的影响&#xff0c;但要说直接验证整个相对性原理&#xff08;狭义广义&#xff09;是不准确的。我们可以逐步分析这个问题&#xff1a;…...

Makefile 在 ARM MCU 开发中的编译与链接参数详解与实践

内容大纲 引言 一、预处理与宏定义 头文件搜索路径:-I 宏定义:-D 二、编译器选项(CFLAGS) 架构与指令集:-mcpu、-mthumb 优化与调试:-Os、-O2、-g 警告与错误:-Wall、-Werror 代码剥离:-ffunction-sections、-fdata-sections 其他常用选项 三、链接器选项(LDFLAGS) 链…...

AimRT 从零到一:官方示例精讲 —— 四、logger示例.md

logger示例 官方仓库&#xff1a;logger 配置文件(configuration_logger.yaml​) 依据官方示例项目结构自行编写YAML配置文件&#xff1a; # 基础信息 base_info:project_name: Logger # 项目名称build_mode_tags: ["EXAMPLE", "SIMULATION", "TE…...

mybatis传递多个不同类型的参数到mapper xml文件

在业务中查询某张表时需要设置多个查询条件&#xff0c;并且还要根据id列表进行权限过滤&#xff0c;这时推荐采用Map<String, Object>作为参数进行查询&#xff0c;因为&#xff1a;Object可以设置成不同的类型&#xff0c;比如&#xff1a;List<Integer> ids&…...

信创开发中的数据库详解:国产替代背景下的技术生态与实践指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

【Linux】第十三章 访问Linux文件系统

目录 1. 存储设备是什么&#xff1f;怎么理解分区和格式化&#xff1f; 2. 文件系统是什么&#xff1f; 3. 挂载是什么&#xff1f;挂载点是什么&#xff1f; 4. 怎么理解块设备&#xff1f; 5. 在SATA附加存储中&#xff0c;第一磁盘上的第一个分区和第二磁盘的第二个分区…...

多态与虚函数

在 C 中&#xff0c;virtual 关键字用于实现多态性&#xff08;Polymorphism&#xff09;&#xff0c;这是面向对象编程&#xff08;OOPP&#xff09;的核心特性之一。多态性允许你编写通用的代码&#xff0c;该代码可以操作不同类型的对象&#xff0c;而这些对象可以有不同的内…...

Spring Boot - 配置管理与自动化配置进阶

Spring Boot 的配置管理和自动化配置是其核心特性之一&#xff0c;能够显著提升开发效率和应用灵活性。本文将深入探讨以下内容&#xff1a; 1、配置管理&#xff1a;多环境配置与优先级解析。 2、自动化配置&#xff1a;自定义 Spring Boot Starter 与 spring.factories 扩展…...

第六章 QT基础:7、Qt中多线程的使用

在进行桌面应用程序开发时&#xff0c;假设应用程序需要处理比较复杂的逻辑&#xff0c;如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。 这种情况下&#xff0c;需要使用多线程&#xff1a; 主线程处理窗口事件和控件更新子线程进…...

前端Vue3 + 后端Spring Boot,前端取消请求后端处理逻辑分析

在 Vue3 Spring Boot 的技术栈下&#xff0c;前端取消请求后&#xff0c;后端是否继续执行业务逻辑的答案仍然是 取决于请求处理的阶段 和 Spring Boot 的实现方式。以下是结合具体技术的详细分析&#xff1a; 1. 请求未到达 Spring Boot 场景&#xff1a;前端通过 AbortContr…...

ShaderToy学习笔记 05.3D旋转

1. 3D旋转 1.1. 汇制立方体 由于立方体没有旋转&#xff0c;所以正对着看过去时&#xff0c;看起来是正方形的&#xff0c;所以需要旋转一下&#xff0c;才能看到立方体的样子。 常见几何体的SDF BOX 的SDF为 float sdBox( vec3 p, vec3 b ) {vec3 q abs(p) - b;return len…...

编程日志4.24

栈的链表基础表示结构 #include<iostream> #include<stdexcept> using namespace std; //模板声明&#xff0c;表明Stack类是一个通用的模板&#xff0c;可以用于存储任何类型的元素T template<typename T> //栈的声明 //Stack类的声明&#xff0c;表示一…...

通信设备制造数字化转型中的创新模式与实践探索

在数字化浪潮下&#xff0c;通信设备制造企业积极探索创新模式&#xff0c;推动数字化转型&#xff0c;以提升竞争力和适应市场变化。 在生产模式创新方面&#xff0c;企业引入工业互联网平台&#xff0c;实现设备互联互通与生产过程智能化监控。通过在生产设备上安装传感器&a…...

同一个路由器接口eth0和ppp0什么不同?

答案摘自 百度知道&#xff0c; eth0是以太网接口&#xff0c;是表示以太网连接的物理接口&#xff0c;路由器可能会有不止一个以太网接口&#xff0c;因此可能会eth0&#xff0c;eht1之类的。 ppp0是经以太网接口PPP拨号时创建的链路接口&#xff0c;用以建PPP拨号连接的&am…...

零训练成本优化LLM: 11种LLM权重合并策略原理与MergeKit实战配置

随着大语言模型的快速发展&#xff0c;如何在不消耗大量计算资源的情况下优化模型性能成为业界关注焦点。模型权重合并技术提供了一种零训练成本的高效解决方案&#xff0c;能够智能整合多个专业微调模型的优势&#xff0c;无需额外训练即可显著提升性能表现。本文系统剖析11种…...

基于tabula对pdf中多个excel进行识别并转换成word中的优化(五)

优化地方&#xff1a;处理合并的单元格内容。 1、修改为stream"complex" 2、增加换行符f"{table_data[i - 1][j]}\n{table_data[i][j]}".strip() 一、pdf中excel样例 二、完整代码 import tabula import numpy as np from docx import Document from docx…...

QT中的网络编程

Qt中的网络编程是通过封装操作系统的API进行实现的 C标准库中&#xff0c;并没有提供网络编程的封装接口 进行网络编程时本质是在编写应用层代码&#xff0c;需要传输层提供支持 传输层最核心的协议为UDP/TCP 使用Qt网络编程的API时&#xff0c;需要在.pro文件中添加network模块…...

0.5 像素边框实现

0.5 像素边框怎么实现 文章目录 0.5 像素边框怎么实现方法 1&#xff1a;使用 transform: scale() 缩放&#xff08;推荐&#xff09;方法 2&#xff1a;直接使用 0.5px 边框&#xff08;部分浏览器支持&#xff09;方法 3&#xff1a;使用 box-shadow 模拟边框方法 4&#xff…...

【Vagrant+VirtualBox创建自动化虚拟环境】Ansible测试Playbook

文章目录 Vagrant安装vagrant安装 VirtualBox如何使用 Ansible安装AnsiblePlaybook测试创建hosts文件创建setup.yml文件 Vagrant Vagrant是一个基于Ruby的工具&#xff0c;用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统&#xff0c;使用 Chef创建自动…...

“连接世界的桥梁:深入理解计算机网络应用层”

一、引言 当你浏览网页、发送邮件、聊天或观看视频时&#xff0c;这一切都离不开计算机网络中的应用层&#xff08;Application Layer&#xff09;。 应用层是网络协议栈的最顶层&#xff0c;直接为用户的各种应用程序提供服务。它为用户进程之间建立通信桥梁&#xff0c;屏蔽了…...

Vulkan与OpenGL的对比

传统图形API与现代图形API 传统图形API指的是OpenGL/DirectX11这类简单易用、驱动托管严重的图形接口&#xff1b;而现代图形API则指的是Vulkan/Metal/DirectX12这类使用复杂、暴露更多底层硬件功能来显式控制的弱驱动设计的图形接口。 现代图形API与传统图形API相比&#xff…...

海外社交App的Web3革命:去中心化社交与Token经济实战指南

一、Web3社交的核心组件&#xff1a;从身份到经济的重构 去中心化身份&#xff08;DID&#xff09;技术栈&#xff1a;Ceramic IDX协议构建链上身份图谱代码示例&#xff1a;javascript// 创建DID const ceramic new CeramicClient() const did new DID({ provider: cerami…...

凯撒密码算法的实现

在密码学里&#xff0c;凯撒密码&#xff08;也叫恺撒密码、移位密码、恺撒代码或者恺撒移位&#xff09;是一种简单且广为人知的加密技术。它属于替换密码的一种&#xff0c;在这种加密方式中&#xff0c;明文中的每个字母都会被替换成字母表中往后移动固定位数的字母。例如&a…...

Chrome的插件扩展程序安装目录是什么?在哪个文件夹?

目录 前提 直接复制到浏览器中打开 Mac下Chrome extension 安装路径 最近换了mac pro用起来虽然方便&#xff0c;但是对常用的一些使用方法还是不熟悉。这不为了找到mac上chrome插件的安装路径在哪里&#xff0c;花费了不少时间。我想应用有不少像小编一样刚刚使用mac的小白…...

C++23中的std::forward_like:完美转发的增强

文章目录 一、背景与动机&#xff08;一&#xff09;完美转发的局限性&#xff08;二&#xff09;std::forward_like的提出 二、std::forward_like的设计与实现&#xff08;一&#xff09;基本语法&#xff08;二&#xff09;实现原理&#xff08;三&#xff09;与std::forward…...

AI与软件测试的未来:如何利用智能自动化改变测试流程

用工作流生成测试用例和自动化测试脚本&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;软件测试作为软件开发生命周期中的关键环节&#xff0c;正在经历一场前所未有的变革。传统的测试方法已经无法满足现代快速迭代和持续交付的需求&#xff…...

React Native 动态切换主题

React Native 动态切换主题 创建主题配置和上下文创建主题化高阶组件主应用组件主屏幕组件&#xff08;类组件形式&#xff09; 创建主题配置和上下文 // ThemeContext.jsimport React, { Component, createContext } from react;import { Appearance, AsyncStorage } from rea…...

得物 小程序 6宫格 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 部分python代码 if result …...

PocketFlow一个最小的Agent框架

1、背景 PocketFlow 2、使用 python 的版本需要python3.10 在cookbook中有如何使用的说明&#xff0c;如图所示 在tuils.py中修改代码 def call_llm(messages):# client OpenAI(api_keyos.environ.get("OPENAI_API_KEY", "your-api-key"))client Op…...

Objective-C Block 底层原理深度解析

Objective-C Block 底层原理深度解析 1. Block 是什么&#xff1f; 1.1 Block 的本质 Block 是 Objective-C 中的特殊对象&#xff0c;实现了匿名函数的功能 通过 isa 指针继承自 NSObject&#xff0c;可以响应&#xff08;如 copy、retain、release&#xff09;等内存管理方…...

AlDente Pro for Mac电脑 充电限制保护工具 安装教程【简单,轻松上手】

AlDente Pro for Mac电脑 充电限制保护工具 安装教程【简单&#xff0c;轻松上手】 AlDente Pro for Mac&#xff0c;是一款充电限制保护工具&#xff0c;是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池&#xff08;如 MacBook 中的电池&#xff09;在40&…...

Linux systemd 从理论到实践:现代系统管理的核心工具

文章目录 引言&#xff1a;为什么需要 systemd&#xff1f;第一部分&#xff1a;systemd 核心理论1.1 systemd 的设计哲学1.2 核心组件1.3 单元文件&#xff08;Unit File&#xff09;结构 第二部分&#xff1a;实战操作指南2.1 基础命令2.2 服务管理高级操作2.3 日志管理&…...

分享一个移动端项目模板:React-Umi4-mobile

分享一个移动端项目模板&#xff1a;React-Umi4-mobile 大家好&#xff0c;今天想和大家分享一个我最近做的移动端项目模板 React-Umi4-mobile。 模板的主要内容 这个模板主要包括&#xff1a; 基于 Umi 4 框架使用了 antd-mobile 组件库配置了 px 自动转 vw&#xff08;基…...

Tailwind CSS 响应式设计解析(含示例)

本文内容&#xff1a; Tailwindcss V4 中如何使用响应式设计功能&#xff0c;包括默认断点、自定义断点、断点范围控制以及容器查询的各种技巧&#xff0c;帮助你在不离开 HTML 的前提下优雅构建响应式页面。 &#x1f31f; 默认断点用法&#xff08;移动优先&#xff09; Tail…...

ElasticSearch入门

1 elasticsearch概述 1.1 elasticsearch 简介 官网: https://www.elastic.co/ ElasticSearch是一个基于 Lucene 的搜索服务器&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;开源的企业级搜索引擎。 Elastic官方宣布Elasticsearch进入Version 8…...

强化学习之基于无模型的算法之时序差分法

2、时序差分法(TD) 核心思想 TD 方法通过 引导值估计来学习最优策略。它利用当前的估计值和下一个时间步的信息来更新价值函数&#xff0c; 这种方法被称为“引导”&#xff08;bootstrapping&#xff09;。而不需要像蒙特卡罗方法那样等待一个完整的 episode 结束才进行更新&…...

【网络原理】TCP异常处理(二):连接异常

目录 一. 由进程崩溃引起的连接断开 二. 由关机引起的连接断开 三. 由断电引起的连接断开 四. 由网线断开引起的连接断开 一. 由进程崩溃引起的连接断开 在一般情况下&#xff0c;进程无论是正常结束&#xff0c;还是异常崩溃&#xff0c;都会触发回收文件资源&#xff0c;…...

[stm32] 4-1 USART(1)

文章目录 前言4-1 USARTUSART简介什么是USART?USART名字的含义&#xff1f;如何使用USART&#xff1f; USART的工作原理什么是串并转换&#xff1f;为什么要进行串并转换&#xff1f;移位寄存器串并行转换电路 USART寄存器组和完整框图 前言 本笔记内容&#xff0c;为本人依据…...

C++多线程与锁机制

1. 基本多线程编程 1.1 创建线程 #include <iostream> #include <thread>void thread_function() {std::cout << "Hello from thread!\n"; }int main() {std::thread t(thread_function); // 创建并启动线程t.join(); // 等待线程结束return 0; …...

【MCP Node.js SDK 全栈进阶指南】高级篇(4):自定义传输层开发

引言 在MCP(Model Context Protocol)应用开发中,传输层是连接客户端与服务器的关键环节,直接影响应用的性能、可靠性和扩展性。默认的传输方式虽然能满足基本需求,但在复杂场景下,自定义传输层能够为应用提供更高的灵活性和优化空间。本文将深入探讨MCP TypeScript-SDK中…...

当向量数据库与云计算相遇:AI应用全面提速

如果将AI比作一台高速运转的机器引擎&#xff0c;那么数据便是它的燃料。 然而&#xff0c;存储数据的燃料库--传统数据库&#xff0c;在AI时代的效率瓶颈愈发明显&#xff0c;已经无法满足AI对于数据的全新需求。 因此&#xff0c;向量数据库近年来迅速崛起。向量数据库通过…...

【2024-NIPS-版权】Evaluating Copyright Takedown Methods for Language Models

1.背景 目前 LLMs 在训练过程中使用了大量的受版权保护数据&#xff0c;这些数据会导致大模型记忆并生成与训练数据相似的内容&#xff0c;从而引发版权问题。随着版权所有者对模型训练和部署中的版权问题提起诉讼&#xff08;例如 Tremblay v. OpenAI, Inc. 和 Kadrey v. Met…...

【PyTorch动态计算图原理精讲】从入门到灵活应用

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比二、实战演示环境配置要求核心代码实现案例1:基础计算图构建案例2:条件分支动态图案例3:循环结构动态图运行结果验证三、性能对比测试方…...

阿里巴巴Qwen3发布:登顶全球开源模型之巅,混合推理模式重新定义AI效率

今天凌晨&#xff0c;阿里巴巴正式开源了新一代通义千问大模型Qwen3&#xff0c;这一举措不仅标志着国产大模型技术的又一里程碑&#xff0c;更以“混合推理”“极致性能”“超低成本”三大核心优势&#xff0c;刷新了全球开源模型的竞争格局。Qwen3在多项评测中超越DeepSeek-R…...

5. 配置舵机ID(具身智能机器人套件)

1. 连接舵机 waveshare驱动器板使用9-12v供电Type-C连接电脑DVG连接一个舵机 2. 使用FT SCServo Debug软件 设置串口设置波特率&#xff08;默认1000000&#xff0c;100万&#xff09;打开串口编程界面修改ID 3. 依次修改所有舵机ID 分别使用waveshare驱动板连接舵机&…...

Nacos源码—2.Nacos服务注册发现分析四

大纲 5.服务发现—服务之间的调用请求链路分析 6.服务端如何维护不健康的微服务实例 7.服务下线时涉及的处理 8.服务注册发现总结 7.服务下线时涉及的处理 (1)Nacos客户端服务下线的源码 (2)Nacos服务端处理服务下线的源码 (3)Nacos服务端发送服务变动事件给客户端的源码…...

从Windows开发迁移到信创开发的指南:国产替代背景下的技术路径与实践

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...