工作中需要写一个产测的软件去测试dut,这个dut启动之后,在wan口在DHCP分配一个固定的ip之后就会连接上指定的tcpserver,跟tcpserver只需通信,需要最大做到和16个dut持续的通信。
思路:
首先每一个dut连接上tcpserver之后,会获取到一个连接的对象,和client的ip,按照ip:连接的对象的键值对存到一个字典中,tcpserve 需要跟那个dut通信时候,就用ip到字典取找到该dut的连接的对象,思路确定,开干~上代码
1.首先写一个不阻塞的tcpserver的连接,调用startTcpThreading,会开启一个线程,开启一个tcpserver,最大监听16个,然后while True等待client的接入:
def startTCPSer(ser_addr=('', 888), thread_msg=True):
tcpServer = socket(AF_INET, SOCK_STREAM)
tcpServer.bind(ser_addr)
tcpServer.listen(16)
while True:
# 等待client的接入
tcpCliSock, addr = tcpServer.accept()
# 接入成功,把对应的client的ip和连接对象存入字典
tcp_dict[addr[0]] = tcpCliSock
def startTcpThreading(ser_addr=('', 888), thread_msg=True):
t = threading.Thread(target=startTCPSer, args=(ser_addr, thread_msg))
t.setDaemon(True)
t.start()
2.写一个发送信息的方法
import time
from socket import *
import threading
import binascii
tcp_dict = {}
def send_to_dut(ip, command):
#判断clinet是否跟server建立连接
if ip in tcp_dict:
command_hex = bytes.fromhex(command)
print(command_hex)
#根据ip获取连接对象并发送命令
tcp_dict[ip].send(command_hex)
time.sleep(1)
#接受消息
data = tcp_dict[ip].recv(1024)
result = binascii.b2a_hex(data)
return result
else:
return "dut未跟mes建立tcp连接"
ok,干完了