Socket网络编程入门:从TCP/UDP原理到Python实战Echo服务器
1. 项目概述从“Hello World”到网络世界的第一扇门“网络编程套接字”这听起来像是一个深奥的计算机科学术语但如果你用过任何一款聊天软件、刷过任何一个网页、或者在线看过视频那么你已经和它打过无数次交道了。套接字或者说Socket就是网络世界的“插座”和“插头”。你的电脑、手机任何一个想上网的设备都需要通过这个“插座”接入全球互联网这张大网与其他设备交换数据。今天我们不谈那些复杂的协议栈和内核实现就从最接地气的角度聊聊作为一名开发者如何亲手拧上这个“插座”让数据在你的程序间流动起来。无论你是想写一个简单的局域网聊天工具还是为你的物联网设备添加远程控制功能甚至是理解你每天使用的App背后的通信机制掌握Socket编程都是绕不开的第一步。这篇文章就是为你打开这扇门的钥匙。2. 核心概念拆解Socket到底是什么在深入代码之前我们必须先统一“语言”。很多人一听到Socket就想到TCP、UDP、端口、IP地址这些概念搅在一起容易让人发懵。我们不妨用一个生活中的例子来类比。想象一下你要给另一个城市的朋友寄一封信。Socket套接字就是你写字的那张书桌以及你朋友收信的那个信箱。它代表了通信的端点。IP地址就是你朋友家的街道门牌号它唯一地标识了网络中的一台设备。端口号则是你朋友家的具体房间号比如201房。一台设备一个IP地址上可以运行很多网络程序如微信、浏览器、游戏端口号就是用来区分这些不同程序的“房间”。协议TCP/UDP则是你选择的邮寄方式。TCP像是一份挂号信要求邮局网络必须确保信件送达如果中途丢了会重发并且保证信件按你写的顺序到达而UDP则像是一张明信片你扔进邮筒就不管了便宜快捷但可能丢失也可能后发的明信片先到。所以一个完整的Socket通信需要至少一对套接字一个在客户端一个在服务器端每个套接字由“IP地址 端口号 协议”唯一确定。编程的本质就是创建、配置、连接这些“插座”然后通过它们发送和接收数据。2.1 TCP vs UDP选择你的“邮寄方式”这是网络编程的第一个重大选择决定了你程序的通信性格。TCP传输控制协议面向连接、可靠、基于字节流。面向连接通信前必须经过“三次握手”建立一条虚拟的通信链路就像打电话要先拨通。可靠通过确认、重传、排序等机制保证数据不丢失、不重复、按序到达。基于字节流它把数据看作一连串无结构的字节流没有明显的消息边界。你发送了10字节再发20字节接收方可能一次收到30字节也可能分两次收到。这需要应用层自己处理消息边界例如约定每个消息前4个字节表示消息长度。适用场景对数据准确性要求高的场景如网页浏览HTTP/HTTPS、文件传输FTP、电子邮件SMTP/POP3。UDP用户数据报协议无连接、不可靠、基于数据报。无连接直接发送无需事先建立连接就像发短信。不可靠尽最大努力交付但不保证一定送达也不保证顺序。基于数据报每个发送或接收操作都是以一个完整的“数据包”数据报为单位。发送方一次发送一个包接收方一次接收一个完整的包包与包之间有明确的边界。适用场景对实时性要求高、能容忍少量丢失的场景如视频直播、语音通话、在线游戏、DNS查询。注意这里的“不可靠”是协议层面的不代表UDP没用。恰恰相反在需要低延迟的场景由应用层来实现简单的可靠性控制往往比使用复杂的TCP更高效。2.2 核心函数与编程模型无论TCP还是UDPSocket编程都遵循一套相似的函数调用流程可以概括为几个核心步骤。下面这张表对比了TCP和UDP服务端与客户端的关键步骤差异步骤TCP 服务端TCP 客户端UDP 服务端/客户端 (区别小)1. 创建套接字socket()socket()socket()2. 绑定地址bind()(必须)(通常不需要)bind()(接收方需要)3. 监听连接listen()--4. 建立连接accept()(等待客户端连接)connect()(主动连接服务器)- (无连接)5. 数据传输send()/recv()send()/recv()sendto()/recvfrom()6. 关闭连接close()close()close()关键函数解析socket()创建通信的端点。你需要指定地址族如IPv4的AF_INET、套接字类型面向流的SOCK_STREAM对应TCP数据报的SOCK_DGRAM对应UDP和协议通常填0自动选择。bind()将套接字与一个具体的本地IP地址和端口号绑定。服务器必须调用此函数来指明在哪个“地址端口”上提供服务。客户端通常不调用由系统自动分配一个临时端口。listen()(TCP专用)将主动套接字转为被动监听模式并设置等待连接队列的长度。调用后套接字开始等待客户端的连接请求。accept()(TCP专用)从监听队列中取出一个已建立的连接并返回一个用于和该客户端通信的新套接字。这是理解TCP服务端并发的关键监听套接字只负责接受新连接每个已连接套接字负责与一个特定客户端通信。connect()(TCP客户端专用)客户端主动向服务器发起连接请求进行TCP三次握手。send()/recv()(TCP)与sendto()/recvfrom()(UDP)TCP是面向连接的通信对象在connect/accept时已确定所以收发函数不需要指定地址。UDP是无连接的每次发送(sendto)都必须指定目标地址每次接收(recvfrom)也能得到数据发送方的地址。3. 实战入门手把手实现一个Echo服务器理论说再多不如动手写一行代码。我们分别用TCP和UDP实现一个最简单的“回声”Echo服务器客户端发送什么服务器就原样返回什么。3.1 TCP Echo服务器与客户端Python示例我们先从TCP开始因为它步骤清晰体现了“连接”的概念。TCP服务器端代码 (tcp_echo_server.py)import socket def main(): # 1. 创建TCP套接字 (AF_INET: IPv4, SOCK_STREAM: TCP) server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定地址和端口 # 表示绑定到本机所有可用的IP地址 server_address (, 8888) server_socket.bind(server_address) # 3. 开始监听设置最大等待连接数为5 server_socket.listen(5) print(fTCP Echo服务器已在 {server_address} 启动等待连接...) try: while True: # 4. 等待客户端连接 # accept() 会阻塞直到有客户端连接进来 # client_socket 是用于和这个特定客户端通信的新套接字 # client_address 是客户端的 (IP, PORT) 元组 client_socket, client_address server_socket.accept() print(f接收到来自 {client_address} 的连接) # 5. 处理客户端数据 try: while True: # 接收数据指定缓冲区大小为1024字节 data client_socket.recv(1024) if data: print(f收到来自 {client_address} 的数据: {data.decode(utf-8)}) # 将数据原样发回 client_socket.sendall(data) else: # 如果收到空数据表示客户端已关闭连接 print(f客户端 {client_address} 断开连接) break except ConnectionResetError: print(f与 {client_address} 的连接被意外重置) finally: # 6. 关闭与这个客户端的连接套接字 client_socket.close() except KeyboardInterrupt: print(\n服务器被手动终止) finally: # 7. 关闭服务器监听套接字 server_socket.close() if __name__ __main__: main()TCP客户端代码 (tcp_echo_client.py)import socket def main(): # 1. 创建TCP套接字 client_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 服务器地址和端口 server_address (127.0.0.1, 8888) # 连接本机服务器 try: # 2. 连接到服务器 client_socket.connect(server_address) print(f已连接到服务器 {server_address}) while True: # 3. 获取用户输入 message input(请输入要发送的消息 (输入 quit 退出): ) if message.lower() quit: break # 4. 发送数据 client_socket.sendall(message.encode(utf-8)) # 5. 接收服务器回显的数据 # 注意TCP是流服务器回发的数据可能和发送的数据长度不一致虽然这里简单场景下一致 # 更健壮的做法是循环接收直到收够预期长度的数据。这里简单处理。 echoed_data client_socket.recv(1024) print(f收到服务器回显: {echoed_data.decode(utf-8)}) except ConnectionRefusedError: print(f无法连接到服务器 {server_address}请确保服务器已启动。) except Exception as e: print(f通信过程中发生错误: {e}) finally: # 6. 关闭套接字 client_socket.close() print(连接已关闭) if __name__ __main__: main()实操心得与注意事项地址重用如果你频繁启动关闭服务器可能会遇到“Address already in use”错误。这是因为TCP套接字关闭后会进入TIME_WAIT状态通常2分钟等待处理网络中可能延迟到达的数据包。可以在bind()之前为套接字设置SO_REUSEADDR选项来避免server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)sendall()vssend()send()方法不保证发送所有数据它返回实际发送的字节数。sendall()会内部循环调用send()直到所有数据发送完毕或出错。对于可靠性要求高的场景优先使用sendall()。recv()的阻塞与缓冲区recv(1024)表示最多接收1024字节。如果客户端发送了2000字节第一次recv(1024)拿到前1024字节第二次调用recv(1024)会拿到剩下的976字节。如果对方没有发送数据recv()会一直阻塞等待直到有数据到来或连接关闭返回空数据。这是TCP流式传输的特点应用层必须自己处理消息边界问题。常见的解决方案有定长报文、在报文头添加长度字段、使用特殊分隔符如\n。并发处理上面的服务器是单线程阻塞式的同一时间只能服务一个客户端。当一个客户端连接后accept()就不会被再次调用直到这个客户端断开。要支持多客户端需要使用多线程、多进程或异步I/O如select、poll、epoll或asyncio。3.2 UDP Echo服务器与客户端Python示例UDP的实现就简单直接得多因为它没有连接的概念。UDP服务器端代码 (udp_echo_server.py)import socket def main(): # 1. 创建UDP套接字 (SOCK_DGRAM: UDP) server_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2. 绑定地址和端口 server_address (, 9999) server_socket.bind(server_address) print(fUDP Echo服务器已在 {server_address} 启动等待数据...) try: while True: # 3. 接收数据 # recvfrom() 返回 (data, client_address) # data是字节数据client_address是发送方的(IP, PORT) data, client_address server_socket.recvfrom(1024) if data: message data.decode(utf-8) print(f收到来自 {client_address} 的数据: {message}) # 4. 发送数据回原发送方 # sendto() 需要指定目标地址 server_socket.sendto(data, client_address) except KeyboardInterrupt: print(\n服务器被手动终止) finally: # 5. 关闭套接字 server_socket.close() if __name__ __main__: main()UDP客户端代码 (udp_echo_client.py)import socket def main(): # 1. 创建UDP套接字 client_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 服务器地址 server_address (127.0.0.1, 9999) # UDP不需要connect可以直接发送 # 但也可以调用connect()将套接字与一个默认目标地址关联之后就可以用send()/recv() # client_socket.connect(server_address) try: while True: message input(请输入要发送的消息 (输入 quit 退出): ) if message.lower() quit: break # 2. 发送数据到指定服务器地址 client_socket.sendto(message.encode(utf-8), server_address) # 3. 等待接收回显数据 # 设置超时避免一直等待 client_socket.settimeout(5.0) try: echoed_data, _ client_socket.recvfrom(1024) print(f收到服务器回显: {echoed_data.decode(utf-8)}) except socket.timeout: print(等待服务器响应超时数据包可能已丢失。) except Exception as e: print(f通信过程中发生错误: {e}) finally: # 4. 关闭套接字 client_socket.close() print(客户端已关闭) if __name__ __main__: main()实操心得与注意事项无连接与地址UDP的每次通信都是独立的。服务器通过recvfrom()获得客户端的地址才能用sendto()回复。客户端每次sendto()都必须指定服务器地址。数据报边界UDP的recvfrom(1024)如果对方发送了一个500字节的数据报你会一次性收到这完整的500字节。如果对方发送了1500字节超过了你的缓冲区1024这个数据报会被丢弃并且你可能收到一个错误取决于系统和设置。所以UDP编程中应用层发送的数据包大小必须合理通常要小于网络的MTU最大传输单元通常1500字节减去IP和UDP头。超时设置UDP不保证送达所以客户端在recvfrom()时一定要设置超时settimeout否则如果服务器没有回复或数据包丢失程序会永远阻塞在那里。connect()在UDP中的特殊用途UDP套接字也可以调用connect()但这并不建立TCP那样的连接。它只是在内核中“记住”这个目标地址。之后你就可以使用send()和recv()而不用每次都指定地址。同时只有来自这个“已连接”地址的数据包才会被递送给你的套接字这可以起到简单的过滤作用。4. 深入原理与高级话题理解了基本用法我们再来啃几块硬骨头这些是写出健壮网络程序的关键。4.1 TCP的“三次握手”与“四次挥手”这是TCP可靠连接的基石。很多网络问题如“连接超时”、“端口占用”都源于对这个过程理解不深。三次握手建立连接客户端 - 服务器发送SYN包同步序列号。客户端进入SYN_SENT状态。服务器 - 客户端发送SYN-ACK包确认客户端的SYN并发送自己的SYN。服务器进入SYN_RCVD状态。客户端 - 服务器发送ACK包确认服务器的SYN。双方进入ESTABLISHED状态连接建立。为什么是三次不是两次主要是为了防止已失效的连接请求报文突然又传到了服务器导致服务器错误打开连接。三次握手确保了双方都确认了对方的发送和接收能力是正常的。四次挥手断开连接主动方如客户端 - 被动方发送FIN包表示要关闭连接。主动方进入FIN_WAIT_1状态。被动方 - 主动方发送ACK包确认收到FIN。被动方进入CLOSE_WAIT状态主动方进入FIN_WAIT_2状态。此时是半关闭状态被动方可能还有数据要发送。被动方 - 主动方发送FIN包表示自己也准备关闭。被动方进入LAST_ACK状态。主动方 - 被动方发送ACK包。主动方进入TIME_WAIT状态等待2MSL报文最大生存时间的两倍通常为2分钟后关闭。被动方收到ACK后立即关闭。TIME_WAIT状态的意义1. 确保最后一个ACK能到达被动方如果丢失被动方会重发FIN。2. 让本次连接产生的所有网络报文都在网络中消失避免影响后续使用相同四元组源IP、源端口、目的IP、目的端口的新连接。这就是之前提到的“地址占用”问题的根源。4.2 阻塞、非阻塞与I/O多路复用默认情况下Socket操作是阻塞的。accept()、recv()、connect()对TCP都会使程序暂停直到操作完成。这在处理多个客户端时效率极低。非阻塞模式通过setblocking(False)将套接字设为非阻塞。调用上述函数会立即返回如果操作不能立即完成会抛出BlockingIOError或类似的错误。程序需要不断轮询polling消耗CPU。I/O多路复用这是解决高并发C10K问题的核心。核心思想是让一个线程或进程可以同时监视多个文件描述符包括Socket的状态当其中某些描述符就绪可读、可写或有异常时再通知程序进行处理避免了无谓的轮询。select/poll早期的解决方案。select有文件描述符数量限制通常1024poll没有但两者在描述符很多时性能都会线性下降因为需要将整个描述符集合在用户空间和内核空间之间拷贝。epoll(Linux)/kqueue(BSD/macOS)现代高性能解决方案。采用事件驱动方式内核维护一个就绪列表只将就绪的描述符通知给应用效率极高。Python的selectors模块提供了高级的、跨平台的抽象。异步I/O (如asyncio)在语言层面提供了更优雅的协程支持用同步代码的写法实现异步操作await sock.recv()在数据未就绪时自动挂起协程让出CPU去执行其他任务。4.3 网络字节序与数据结构打包计算机有不同的字节序大端、小端但网络传输必须统一。因此所有超过一个字节的整数如端口号、自定义协议中的长度字段在放入Socket发送前都必须从主机字节序转换为网络字节序大端接收时再转换回来。Python的socket模块提供了函数socket.htons(): 主机序转网络序短整型16位如端口socket.htonl(): 主机序转网络序长整型32位socket.ntohs()/socket.ntohl(): 网络序转主机序对于更复杂的结构体可以使用struct模块的pack()和unpack()函数进行打包和解包。import struct # 将一个无符号短整型端口和一个无符号长整型IP地址打包成网络字节序的字节串 packed_data struct.pack(!HL, 8888, 0x01020304) # ! 表示网络字节序 # 解包 port, ip struct.unpack(!HL, packed_data)5. 常见问题与调试技巧实录在实际开发中你会遇到各种各样稀奇古怪的问题。这里记录一些典型问题和排查思路。5.1 连接相关错误ConnectionRefusedError/[Errno 111] Connection refused原因目标端口没有进程在监听。可能是服务器没启动或者防火墙阻止了连接。排查在服务器端用netstat -an | grep 端口号Linux/macOS或netstat -ano | findstr 端口号Windows检查端口是否处于LISTEN状态。检查服务器程序是否真的绑定到了你试图连接的IP和端口0.0.0.0表示所有接口。检查服务器和客户端之间的防火墙规则。[Errno 10061]或[WinError 10061]这是Windows上“连接被拒绝”的另一种表现形式原因同上。[Errno 10048]或[WinError 10048]通常每个套接字地址(协议/网络地址/端口)只允许使用一次。原因试图绑定的地址和端口已经被另一个套接字占用。最常见的就是之前的服务器程序没有完全关闭处于TIME_WAIT状态。解决换一个端口。设置SO_REUSEADDR套接字选项如前所述。等待TIME_WAIT状态结束约2分钟。找出占用端口的进程并结束它lsof -i :端口号或netstat -ano | findstr :端口号找到PID然后kill PID。[Errno 10054]远程主机强迫关闭了一个现有的连接。原因对方通常是服务器粗暴地关闭了连接发送了RST包而不是通过正常的四次挥手。常见于服务器进程崩溃、或你的客户端在对方还有数据要发时过早关闭了套接字。处理在代码中捕获这个异常ConnectionResetError进行清理和重连逻辑。5.2 数据传输与协议问题TCP粘包/拆包问题现象发送方分两次发送“Hello”和“World”接收方可能一次收到“HelloWorld”也可能收到“Hel”、“loWorld”等。本质TCP是字节流没有消息边界。解决方案应用层协议设计定长消息每条消息固定长度不足补位。简单但不够灵活。分隔符用特殊字符如\n标记消息结束。需要转义分隔符本身。长度前缀最常用的方法。在消息头用固定字节数如4字节存放消息体的长度。接收方先读头知道长度N再循环读取直到收满N字节。# 发送方 message bHello, World! length len(message) # 将长度打包为4字节网络序 header struct.pack(!I, length) sock.sendall(header message) # 接收方 def recv_all(sock, n): data b while len(data) n: packet sock.recv(n - len(data)) if not packet: return None data packet return data header recv_all(sock, 4) if header: length struct.unpack(!I, header)[0] message_body recv_all(sock, length)UDP数据包丢失与乱序现象发送10个包只收到8个且顺序可能不对。应对应用层确认与重传为每个包编号接收方收到后回复ACK。发送方超时未收到ACK则重传。前向纠错发送冗余数据允许接收方在丢失部分包的情况下恢复原始数据。调整发送速率实现简单的拥塞控制避免网络拥堵导致大量丢包。接受不完美对于实时音视频偶尔丢包比延迟重传更重要可以采用插值等方式弥补。5.3 调试与工具netstat/ss查看网络连接、监听端口、路由表等信息的瑞士军刀。ss是netstat的现代替代品速度更快。tcpdump/Wireshark网络抓包神器。tcpdump是命令行工具Wireshark是图形化界面。它们可以捕获流经网卡的所有数据包让你清晰地看到TCP三次握手、数据传输、四次挥手的每一个细节是排查复杂网络问题的终极武器。例如用tcpdump -i any port 8888可以抓取所有经过8888端口的流量。telnet/nc(netcat)手动测试TCP服务的利器。telnet 服务器IP 端口可以建立一个原始的TCP连接然后你手动输入数据发送。nc功能更强大还能用于UDP测试和端口扫描。iperf3专业的网络带宽测试工具。可以用来测试TCP/UDP的吞吐量、延迟、丢包率非常有助于评估网络性能和排查带宽相关问题。网络编程是一个实践性极强的领域光看不动手永远学不会。我的建议是从上面的Echo例子开始先让它在你的本地跑起来。然后尝试修改它给TCP协议加上长度前缀解决粘包给UDP加上超时重传和序列号用selectors模块改写服务器使其能处理多个客户端。在这个过程中你会遇到无数错误但每一个错误的解决都会让你对网络的理解更深一层。当你能够自如地驾驭Socket让数据在不同机器间可靠或高效地穿梭时你会发现整个世界都连接在了一起。

相关新闻

React+TypeScript结合AI实现表单代码自动生成:架构设计与工程实践

React+TypeScript结合AI实现表单代码自动生成:架构设计与工程实践

1. 项目概述:当React/TS遇见AI代码生成最近在重构一个内部的管理后台,产品经理提了个需求,希望能在表单配置页面,根据用户选择的字段类型,自动生成对应的表单验证规则和初始值。这活儿要是手动写,每个字段都…

2026/8/11 7:03:22 阅读更多 →
Java Web上传文件到指定目录?这波操作直接让你少走十年弯路

Java Web上传文件到指定目录?这波操作直接让你少走十年弯路

在所存在的Java Web应用里头达成文件进行上传以及下载功能的操作, 能够借由下列的步骤予以达成:1. 文件上传(1)在前端页面中添加一个文件上传表单。(2)在后端的代码里边, 借助对象去获取上传上来的文件, 能够运用工具类达成文件的…

2026/8/11 7:02:22 阅读更多 →
Godot游戏开发:构建企业级日志系统,提升调试效率与项目可维护性

Godot游戏开发:构建企业级日志系统,提升调试效率与项目可维护性

1. 项目概述:为什么Godot需要一个自定义Logger?在Godot里做项目,尤其是稍微复杂点的游戏或者工具应用,调试信息输出是绕不开的一环。引擎自带的print()和push_error()用起来确实方便,但项目规模一旦上来,你…

2026/8/11 7:02:22 阅读更多 →

最新新闻

企业AI项目算法选型7大避坑指南与实战经验

企业AI项目算法选型7大避坑指南与实战经验

1. 企业AI创新中的算法选型挑战最近三年,我作为AI应用架构师参与了17个企业级AI项目的落地实施。在这些项目中,算法选型环节总是最容易出现问题的关键节点。很多企业投入大量资源采购算力、组建团队,却在算法选型这个基础环节栽了跟头。算法选…

2026/8/11 7:43:42 阅读更多 →
APS 软件系统如何对生产计划进行多维度分析和优化

APS 软件系统如何对生产计划进行多维度分析和优化

1. 引言在现代制造业中,生产计划的质量直接影响企业的交付能力、库存水平和资源利用率。传统的人工排产或基于 ERP 的 MRP 计算往往只考虑物料需求这一个维度,难以应对多品种、小批量、短交期且资源约束复杂的实际生产环境。高级计划与排程系统&#xff…

2026/8/11 7:43:42 阅读更多 →
Windows文件恢复原理与实战:从误删到恢复的完整指南

Windows文件恢复原理与实战:从误删到恢复的完整指南

1. 从一次手滑删除说起:为什么文件恢复是门技术活 相信每个用Windows电脑的人都经历过这种心跳漏跳一拍的瞬间:不小心按下了ShiftDelete,或者清空了回收站,然后猛然意识到,刚刚删除的那个文件,可能是还没保…

2026/8/11 7:42:42 阅读更多 →
从ls命令入门到命令行高效工作流:运维与数据工程师的实战指南

从ls命令入门到命令行高效工作流:运维与数据工程师的实战指南

1. 项目概述:从“ls”出发,探索命令行的世界 在任何一个与计算机打交道的场景里,无论是管理服务器、分析数据,还是日常整理文件,我们总会遇到一个最基础、最频繁的动作:查看当前有什么。在图形界面里&#…

2026/8/11 7:42:42 阅读更多 →
QtScrcpy:免费开源的安卓投屏控制软件完整指南

QtScrcpy:免费开源的安卓投屏控制软件完整指南

QtScrcpy:免费开源的安卓投屏控制软件完整指南 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 还在为手机屏幕太小而烦恼吗?想在电脑上流畅玩手游却找不到合…

2026/8/11 7:42:42 阅读更多 →
CISSP/CCSP持证者必读:CPE积分获取与AMF缴纳全攻略

CISSP/CCSP持证者必读:CPE积分获取与AMF缴纳全攻略

1. 证书到手只是开始:理解CPE与AMF的“年费”机制 刚拿到CISSP或CCSP证书那会儿,感觉整个人都飘了,仿佛职业生涯的“金钟罩”已经穿上。但没过多久,邮箱里那封来自ISC的“年度维护费”(Annual Maintenance Fee, AMF&am…

2026/8/11 7:42:41 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →