我对Python很陌生,我正在尝试创建一个到服务器和客户端的gui接口,以显示用户数据和web数据。当我试图制造威胁的时候。线程到s.recv函数它不会阻止服务器冻结。。。当服务器到达s.recv函数时,我如何使其不冻结?提前感谢!
我的一些代码:
def receive_message():
"""
"""
global G
s =socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((UDP_IP, UDP_PORT))
G.insert(INSERT, "Welcome to the 'Sniffer' server")
ROOT.update() # updates the Tkinter form
#time.sleep(1)
G.insert(INSERT, "n")
while 1:
data = threading.Thread(target=s.recv(BUFFER_SIZE)).start()
if ("ip" not in format(data.decode()) and format(data.decode()).count('$') == 3):
sql = format(data.decode())
sqllist = list(sql.split("$"))
sqllist = [sqllist]
sql_connection(sqllist)
elif ("ip" not in format(data.decode()) and format(data.decode()).count('$') == 4):
sql = format(data.decode())
sqllist = list(sql.split("$"))
sqllist = [sqllist]
sql_connection2(sqllist)
if ("$" not in format(data.decode())):
G.insert(INSERT, format(data.decode()))
ROOT.update() # updates the Tkinter form
time.sleep(1)
G.insert(INSERT, "n")
if not data:
break
您就快到了。当您调用s.recv
函数时,实际上是在主线程中执行它,并将返回数据传递给线程。因此,基本上,您不在单独的线程中执行s.recv
函数,这就是导致服务器冻结的原因。
相反,使用参数调用这样的线程。
data = threading.Thread(target=s.recv, args=(BUFFER_SIZE,)).start()
没有必要在这里创建线程,因为您的代码(试图(立即消耗数据。您的问题是调用s.recv()
试图使用其返回值来生成线程。它只是一个字节字符串,而不是一个函数,所以不会发生任何事情。但还有其他问题。Thread.start
方法返回None
,而不是返回的数据。事实上,Thread
将丢弃目标的返回值。您需要一种不同的方式来保存数据。这是中等难度的,在这里不需要。
此代码的解决方案是完全跳过线程。这里还有一个更微妙的错误。你想明确定义protol的编码是什么。如果你只使用默认值,那么在不同的机器上可能会有所不同。只需解码一次,无需消耗您的cpu。
while 1:
data = s.recv(BUFFER_SIZE).decode('utf-8')
...etc...