基于python多线程的socket压测
对登录功能进行压力测试:
发送数据格式:字节长度+字节
1.连接socket
import socket, json, time, threading host = "127.0.0.1" port = 55552
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建socket对象 使用IPV4进行通信 流式套接字 s.connect((host, port))
2.发送消息(python3,必须发送字节类型的数据)
(1)处理要发送的数据为bytes类型
数字转字节参考https://www.cnblogs.com/liyuanhong/p/12133745.html
def bytes_mess(sData): # sData:传入的要发送数据的字符串形式 str_data = sData.encode() # 字符串转字节 默认'utf-8' byts_num = len(str_data).to_bytes(4, byteorder='little') # 返回整数的字节数组 result = byts_num + str_data # 返回发送数据 return result
(2)发送数据
s.send("要发送的内容")
3.使用多线程模拟用户进行登录
import socket, json, time, threading host = "127.0.0.1" port = 55552 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) class LoadThread(threading.Thread): def __init__(self, thread_id, name): threading.Thread.__init__(self) # print("实例化对象继承线程模块") self.thread_id = thread_id self.name = name def max_logNum(self): # 最大登录数 log = { "senderID": "635", "type": 1, "area": 1, "command": 0, "message": "{\"id\":635,\"account\":\"arid_17828476647\",\"mobile\":\"17828476647\",\"school_id\":0,\"school_name\":null,\"role_id\":8,\"role\":\"\\u7528\\u6237\",\"role_type\":1,\"token\":{\"access_token\":\"\",\"expires_in\":1200,\"token_type\":\"Bearer\",\"refresh_token\":\"\"},\"avatar_url\":null,\"nickname\":\"\"}" } log["senderID"] = str(self.thread_id) mess = json.loads(log["message"]) mess["id"] = self.thread_id mess["nickname"] = str(self.thread_id) log["message"] = json.dumps(mess) str1 = json.dumps(log) return str1 def max_makeRoom(self): # 最大直播间数,与线程数相同20 new_room = {"senderID": "635", "type": 3, "area": 3, "command": -1, "message": "{\"roomID\":\"635\",\"roomName\":\"635\",\"homeownerId\":null,\"password\":null,\"hasPassword\":false,\"number\":0,\"courseID\":-1,\"operatorId\":\"\",\"RoomState\":0}"} new_room["senderID"] = str(self.thread_id) mess = json.loads(new_room["message"]) mess["roomID"] = str(self.thread_id) mess["roomName"] = str(self.thread_id) mess["homeownerId"] = str(self.thread_id) new_room["message"] = json.dumps(mess) nRoom = json.dumps(new_room) return nRoom def bytes_login(self): i = self.max_logNum() # 得到要发送数据的字符串 str_data = i.encode() # 字符串转字节 默认'utf-8' byts_num = len(str_data).to_bytes(4, byteorder='little') # 返回整数的字节数组 result = byts_num + str_data # 返回发送数据 return result def run(self): while 1: send_data = self.bytes_login() s.send(send_data) print("正在运行线程%s,id=%s" % (self.name, self.thread_id)) if __name__ == '__main__': for i in range(200): t = LoadThread(i, i) t.start()

浙公网安备 33010602011771号