基于Python的基础socket库实现的多线程并发压测工具

由于端口的性能限制,对单通道进行压测时TPS经常上不去,因此我们常常会配置多个端口的长连接来进行压测,而基础的socket连接只针对单个地址加端口来维护连接,对于这种限制,我们可以使用多线程的Thread库来解决问题。
Socket:

由于python的socket具备自动维护心跳包的性质,因此在C端创建连接时对短连接和长连接不做区别,只要服务端不做断开就会一直保持连接。那么使用socket库提供的函数,我们可以实现一个简单的以输入的TPS来发送数据包的函数。

def msgSendbyTPS(msg, connection, TPS):
   while True:
       t = time.time()
       for i in range(TPS):
       		connection.send(msg)
       time.sleep(1 + t - time.time())

此函数模拟TPS的方法是在一秒开始时尽快发送完一秒内的TPS笔报文,然后暂停至一秒结束。不适用于需要准备过于复杂的报文或是超高TPS要求的情况,需要修改。

简易多端口并发:
def multiMsgSendByTPS(msg, TPS, ip, port, port2=0, port3=0, port4=0):
    C1 = socket(AF_INET, SOCK_STREAM)
    C1.connect((ip, port))
    C2 = socket(AF_INET, SOCK_STREAM)
    C2.connect((ip, port2))
    C3 = socket(AF_INET, SOCK_STREAM)
    C3.connect((ip, port3))
    C4 = socket(AF_INET, SOCK_STREAM)
    C4.connect((ip, port4))
    print('succeed in connecting ...')
    flag = 1
    while True:
        if flag == 1:msgSendbyTPS(msg, C1, TPS)
        elif flag == 2:msgSendbyTPS(msg, C2, TPS)
        elif flag == 3:msgSendbyTPS(msg, C3, TPS)
        elif flag == 4:msgSendbyTPS(msg, C4, TPS)
        else:
            msgSendbyTPS(msg, C1, TPS)
            flag = 1
        print(length, ' msg sent through port ', flag)
        flag = flag + 1
        time.sleep(1 + t - time.time())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows下,可以使用Socket多线程实现并发通信。以下是一个实现的大致流程: 1. 导入必要的模块和,如`socket`、`threading`。 2. 创建Socket对象,绑定IP地址和端口号。 3. 定义一个处理客户端请求的函数,作为线程的执行函数。在该函数中,可以使用Socket接收客户端消息,进行处理,并发送响应给客户端。 4. 创建多个线程,每个线程都执行上述定义的函数。 5. 启动线程,使它们开始并发处理客户端请求。 具体代码如下: ```python import socket import threading # 创建 socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8888)) # 绑定 IP 地址和端口号 # 处理客户端请求的函数 def handle_client(client_socket): # 接收客户端消息 data = client_socket.recv(1024) # 处理消息 response = 'Hello, Client!' # 假设回复消息为 "Hello, Client!" # 发送响应给客户端 client_socket.sendall(response.encode()) # 关闭客户端连接 client_socket.close() # 启动多个线程处理客户端请求 def start_server(): while True: server_socket.listen(5) # 监听客户端连接 client_socket, client_address = server_socket.accept() # 接受客户端连接 # 创建线程并启动 client_thread = threading.Thread(target=handle_client, args=(client_socket,)) client_thread.start() # 启动服务器 if __name__ == '__main__': start_server() ``` 以上代码中,服务器使用`socket`模块创建了一个TCP服务器,并绑定到本地`localhost`的8888端口上。`handle_client`函数用于处理接收到的客户端请求,其中接收到的消息被处理后回复给客户端。`start_server`函数负责监听客户端连接,并创建线程去处理客户端请求。 这样,当有多个客户端连接到服务器时,每一个客户端请求都会被一个单独的线程并发处理,实现了基于Socket多线程并发通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值