【Python】实现简单的socket通信

是小鱼呀·2022-01-29 15:40·720 次阅读

【Python】实现简单的socket通信

背景:做测试工作时,经常碰到只做上游,或只做下游项目的情况。此时需要自己写脚本模拟另一端的数据。本文在此记录如何实现一个简单的socket通信。

client.py

Copy
# 导入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

Copy
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()
posted @   是小鱼呀  阅读(720)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示