【Python】实现简单的socket通信
背景:做测试工作时,经常碰到只做上游,或只做下游项目的情况。此时需要自己写脚本模拟另一端的数据。本文在此记录如何实现一个简单的socket通信。
client.py
# 导入socket库
import socket
import threading
import time
HOST = '127.0.0.1'
POST = 50009
def loop():
# 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET指定使用IPv4协议,SOCK_STREAM指定使用面向流的TCP协议
# 建立连接:
s.connect((HOST, POST)) # 服务器的IP地址和端口号
n = 0
while n < 10:
n = n + 1
data_heartbeat = b'$000001#'
# 发送数据
s.sendall(data_heartbeat)
time.sleep(1)
# 打印接收服务端的数据
print(s.recv(1024).decode("gbk"))# 每次最多接收1k字节,编码是gbk
for i in range(3):
t= threading.Thread(target=loop, name='LoopThread').start()
server.py
import socketserver
import time
class Handler(socketserver.BaseRequestHandler):
def setup(self):
"""连接成功,塞入连接池"""
self.request.sendall("connect success!".encode(encoding='gbk')) # 向客户端发送连接成功信息
print("Connected by ", self.client_address)
socket_request_pool.append(self.request) # 当前socket连接对象放入连接池
def handle(self):
""" 收到消息处理,异常或空消息,断开连接,心跳则返回消息"""
try:
while True:
self.data = self.request.recv(1024)
print("online num", len(socket_request_pool))
print("{} send:".format(self.client_address), self.data.decode(encoding="gbk"))
if not self.data:
print("Connection lost")
self.remove()
break
self.data_str = self.data.decode('GBK') # 接收到的数据从byte-->str ,gbk编码
self.data_content = self.data_str.strip('$#') # 去掉首尾字符
if len(self.data_content) == 6:
self.request.sendall(self.data) # 发送收到的内容,即心跳协议的响应
time.sleep(2)
print("服务端发送心跳响应成功," + '终端号:' + self.data_content + ',' + time.strftime("%Y-%m-%d %H:%M:%S",
time.localtime()))
except Exception as e:
print(self.client_address, "Connection lost")
self.remove()
finally:
self.request.close()
def finish(self):
""" 环境清理,在handle()之后执行清除操作,默认什么都不做,
如果setup()和handle()方法都不生成异常,则无需调用该方法"""
print("client clean", self.client_address)
def remove(self):
"""连接断开后,从连接池中删除socket对象"""
print("client remove")
socket_request_pool.remove(self.request)
print("online num: ", len(socket_request_pool))
if __name__ == '__main__':
ADDRESS = ('127.0.0.1', 50009)
socket_request_pool = [] # 连接池
server = socketserver.ThreadingTCPServer(ADDRESS, Handler)
server.serve_forever()
作者: 是小鱼呀
出处:https://www.cnblogs.com/sophia12138/p/15855214.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)