python编程语法基础笔记(4.13)(网络编程)
一、网络编程核心概述1. 核心让不同计算机上运行的程序实现数据交互如聊天、传文件、接口调用核心是基于 TCP/UDP 协议完成通信。2. 网编三要素要素作用关键细节IP设备在网络中的唯一标识分 IPv4四字节十进制如 192.168.0.105和 IPv6八字节十六进制一台设备可有多 IP内网 外网一个 IP 可对应多个端口端口标识计算机内的进程取值范围 0-655350-1023 为系统占用端口1024-49151 为注册端口49152-65535 为动态私有端口客户端临时使用例MySQL 默认端口 3306可修改协议定义通信规则核心为 TCP/UDP只有符合协议的设备才能通信3. 进程与线程基础补充进程CPU 分配资源的最小单位独立内存空间进程间数据隔离如微信、浏览器是不同进程线程CPU 调度的基本单位依附进程存在同一进程内线程共享数据如微信同时聊天、收消息、刷朋友圈通俗理解进程是 “独立容器”线程是 “容器里的工人”容器间互不干扰工人共享资源。二、TCP vs UDP核心通信协议1. 核心特性对比特性TCP传输控制协议UDP用户数据报协议连接特性面向连接三次握手建立四次挥手关闭无连接直接收发无需建立连接可靠性可靠保证数据不丢失、不重复、按序到达不可靠不管丢包只管发送传输形式基于字节流无消息边界易粘包 / 拆包基于数据包界限清晰发一次是一包速度慢有确认、重传机制极快无额外开销典型应用场景网页浏览、文件下载、数据库连接直播、视频通话、游戏实时操作2. TCP 关键问题粘包 / 拆包原因TCP 是字节流无消息边界多条消息可能挤在一起粘包一条消息可能被拆分拆包解决方法应用层自定义规则固定长度每条消息强制固定字节数如 10 字节分隔符每条消息结尾加特殊符号如 \n长度 内容最常用前 N 字节表示内容长度后续为实际数据例[5][hello][5][world]。三、Socket 套接字网络通信工具1. 核心定义Socket套接字是进程间网络通信的工具类比 “电脑之间通信的插座 插头”是实现 TCP/UDP 通信的核心载体。2. Socket 对象创建import socket # 参数1地址类型AF_INETIPv4AF_INET6IPv6 # 参数2协议类型SOCK_STREAMTCPSOCK_DGRAMUDP tcp_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)四、编码与解码数据传输必备网络传输的是字节流需将字符串与字节相互转换1. 核心概念编码将可读字符串转为字节str.encode(编码格式)解码将字节转回可读字符串bytes.decode(编码格式)。2. 关键细节英文 / 数字 / 特殊符号任意编码格式均占 1 字节中文GBK 占 2 字节UTF-8 占 3 字节二进制简写b字母/数字/特殊符号仅支持 ASCII 字符。3. 代码示例s 你好 # 编码 print(s.encode(utf-8)) # b\xe4\xbf\xa1\xe6\x80\x9d\xe6\x99\xba\xe5\xad\xa6 print(s.encode(gbk)) # b\xd0\xc5\xcb\xbc\xd6\xc7\xd1\xa7 # 解码 res b\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c print(res.decode(utf-8)) # 你好世界五、TCP Socket 实战服务端 客户端1. 服务端流程核心监听 应答import socket # 1. 创建TCP Socket对象 server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定IP和端口 server_socket.bind((192.168.0.105, 8888)) # 3. 设置监听最多排队10个已握手未处理的连接 server_socket.listen(10) # 4. 等待客户端连接阻塞返回通信通道客户端地址 conn, client_addr server_socket.accept() # 5. 发送数据需转字节 conn.send(bhello) # 6. 接收数据指定缓冲区大小解码为字符串 data conn.recv(1024).decode(utf-8) print(f收到客户端消息{data}) # 7. 关闭连接 conn.close()2. 客户端流程核心连接 收发import socket # 1. 创建TCP Socket对象 client_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 连接服务端IP端口 client_socket.connect((192.168.0.105, 8888)) # 3. 接收服务端数据 data client_socket.recv(1024).decode(utf-8) print(收到服务端消息:, data) # 4. 发送数据支持emojiUTF-8编码 client_socket.send(.encode(utf-8)) # 5. 关闭连接 client_socket.close()