基于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()

 

posted @ 2020-07-28 14:31  海浪。  阅读(395)  评论(0)    收藏  举报