-
Notifications
You must be signed in to change notification settings - Fork 42
运行TCP服务器时报错 #4
Description
Traceback (most recent call last):
File "C:\Users\20762\anaconda3\envs\databasetry\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Users\20762\anaconda3\envs\databasetry\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\20762\Downloads\NetAssist_PyQt-main\src\Network\Tcp.py", line 57, in tcp_server_concurrency
for client, address in self.client_socket_list:
AttributeError: 'MainWindow' object has no attribute 'client_socket_list',报错原因是:Tcp.py中的tcp_server_concurrency函数出错,具体如下:
for client, address in self.client_socket_list:
try:
recv_msg = client.recv(4096)
except Exception as ret:
pass
else:
if recv_msg:
info = recv_msg.decode("utf-8")
msg = f"来自IP:{address[0]}端口:{address[1]}:"
self.tcp_signal_write_msg.emit(msg)
self.tcp_signal_write_info.emit(info, self.InfoRec)
else:
client.close()
self.client_socket_list.remove((client, address))
如上代码段,应在前面的else条件语句下,而非与else平级
修改后的完整tcp_server_concurrency代码如下:
def tcp_server_concurrency(self):
"""
功能函数,供创建线程的方法;
使用子线程用于监听并创建连接,使主线程可以继续运行,以免无响应
使用非阻塞式并发用于接收客户端消息,减少系统资源浪费,使软件轻量化
:return: None
"""
while True:
try:
client_socket, client_address = self.tcp_socket.accept()
except Exception as ret:
sleep(0.002)
else:
client_socket.setblocking(False)
# 将创建的客户端套接字存入列表,client_address为ip和端口的元组
self.client_socket_list.append((client_socket, client_address))
msg = f"TCP服务端已连接IP:{client_address[0]}端口:{client_address[1]}\n"
self.tcp_signal_write_msg.emit(msg)
# 轮询客户端套接字列表,接收数据
for client, address in self.client_socket_list:
try:
recv_msg = client.recv(4096)
except Exception as ret:
pass
else:
if recv_msg:
info = recv_msg.decode("utf-8")
msg = f"来自IP:{address[0]}端口:{address[1]}:"
self.tcp_signal_write_msg.emit(msg)
self.tcp_signal_write_info.emit(info, self.InfoRec)
else:
client.close()
self.client_socket_list.remove((client, address))