import socket import threading from PyQt5.QtCore import * STR_RED="\033[1;31m" STR_BLUE="\033[1;34m" STR_YELLOW="\033[1;33m" STR_END="\033[0m" class myudp(QObject): dst_ip_list=[] # 进度信号,ip,1~100 rate_signal =pyqtSignal([str,int]) # 结束信号,ip,成败,描述 end_signal = pyqtSignal([str,bool,str]) # 数据信号,有的命令有返回数据 data_signal = pyqtSignal([str,str]) def __init__(self,start,end): QObject.__init__(self) self.start=start self.end=end def test_comm(self,ip): # 1.创建socket套接字 udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # AF_INET表示使用ipv4,默认不变,SOCK_DGRAM表示使用UDP通信协议 # 2.绑定端口port local_addr = ("", 0) # 默认本机任何ip ,指定端口号7878 udp.bind(local_addr) # 绑定端口 udp.settimeout(1.5) # 3.收发数据 send_data = "whos\n" udp.sendto(send_data.encode("utf-8"), (ip, 7777)) # 编码成全球统一数据格式,用元组表示接收方ip和port try: recv_data = udp.recvfrom(1024) # 定义单次最大接收字节数 recv_msg = recv_data[0] # 接收的元组形式的数据有两个元素,第一个为发送信息 send_addr = recv_data[1] # 元组第二个元素为发信息方的ip以及port # print ("收到的信息为:", recv_msg.decode("utf-8")) # 默认从windows发出的数据解码要用”gbk”,保证中文不乱码 # print ("发送方地址为:", str(send_addr)) # 强转为字符串输出地址,保证不乱码 str=recv_msg.decode("utf-8").replace("\n","|") print("test_comm",str) list=str.split(",") str=list[1].replace(":","_") self.dst_ip_list.append((send_addr[0],str)) except Exception as reason: pass # print(str(reason)) # 5.关闭套接字 udp.close() # 查找从机 def find(self,ip_prefix): self.dst_ip_list.clear() threads = [] print("find ip {} to {}".format(self.start,self.end)) for i in range(self.start,self.end): ip=ip_prefix+".{}".format(i) # print(ip) # 需要注意的一点是,当创建的元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号,,否则 Python 解释器会将它视为字符串 t = threading.Thread(target=self.test_comm, args=(ip,)) threads.append(t) t.start() #等待所有线程任务结束。 for t in threads: t.join() # 去重 self.dst_ip_list=list(set(self.dst_ip_list)) # 发送命令,recv_num返回次数 def send(self,ip,cmd,recv_num,timeout): resoult=True udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udp=udp self.send_on=True local_addr = ("", 0) udp.bind(local_addr) udp.settimeout(timeout) udp.sendto(cmd.encode("utf-8"), (ip, 7777)) try: index=0 while index