一、socket套接字编程
要求:我们自己想写一款可以数据交互的程序
socket模块
架构启动肯定是先启动服务端再启动客户端
简易代码
import socket
"""
导入模块的两种方式
import句式
from...import...句式
第三方模块下载
pip3 install 模块名==版本号 -i 仓库地址
"""
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
sock, address = server.accept()
print(address)
data = sock.recv(1024)
print(data)
sock.send(b'hello my big baby~~~')
sock.close()
server.close()
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8080))
client.send(b'hello big DSB DSB DSB!')
data = client.recv(1024)
print(data)
client.close()
二、通信循环及代码优化
1.客户端校验消息不能为空
2.服务端添加兼容性代码(mac linux)
3.服务端重启频繁报端口占用错误
from socket import SOL_SOCKET, SO_REUSEADDR
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
4.客户端异常关闭服务端报错的问题
异常捕获
5.服务端链接循环
6.半连接池
设置可以等待的客户端数量
三、黏包现象
数据管道的数据没有被完全取出
TCP协议有一个特性
"""
当数据量比较小 且时间间隔比较短的多次数据
那么TCP会自动打包成一个数据包发送
"""
报头
能够标识即将到来的数据具体信息
eg:数据量多大
struct模块
import struct
import json
d = {
'file_name': '很好看.mv',
'file_size': 1231283912839123123424234234234234234324324912,
'file_desc': '拍摄的很有心 真的很好看!!!',
'file_desc2': '拍摄的很有心 真的很好看!!!'
}
d = json.dumps(d)
res = struct.pack('i',len(d))
print(len(res))
res1 = struct.unpack('i',res)[0]
print(res1)
简易版本报头
import socket
import subprocess
import json
import struct
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
sock, address = server.accept()
while True:
data = sock.recv(1024)
command_cmd = data.decode('utf8')
sub = subprocess.Popen(command_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
res = sub.stdout.read() + sub.stderr.read()
data_first = struct.pack('i', len(res))
sock.send(data_first)
sock.send(res)
import socket
import struct
client = socket.socket()
client.connect(('127.0.0.1', 8080))
while True:
msg = input('请输入cmd命令>>>:').strip()
if len(msg) == 0:
continue
client.send(msg.encode('utf8'))
recv_first = client.recv(4)
real_length = struct.unpack('i',recv_first)[0]
real_data = client.recv(real_length)
print(real_data.decode('gbk'))
扩展知识
在阅读源码的时候
1.变量名后面跟冒号 表示的意思是该变量名需要指代的数据类型
2.函数后跟横杆加大于号表示的意思是该函数的返回值类型
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用