【发布时间】:2020-12-29 10:55:41
【问题描述】:
试图添加异常,当服务器断开时程序(客户端)应该怎么做。
这个想法很简单。如果服务器关闭 - 客户端应该尝试连接到服务器,直到服务器打开。
当服务器关闭时 - 程序尝试连接。但是当我打开服务器时,客户端已连接,并且在该连接断开后,在客户端应用程序中我看到了 - QThread: Destroyed while thread is still running 这是我想要的简单示例(客户端的最小可复制示例):
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import socket
class ListeningThread(QtCore.QThread):
mysignal = QtCore.pyqtSignal(str)
def __init__(self, server_socket, parent=None):
QtCore.QThread.__init__(self, parent)
self.server_socket = server_socket
self.message = None
def run(self):
try:
while True:
self.message = self.server_socket.recv(4096)
self.mysignal.emit(self.message.decode('utf-8'))
except:
Push()
class Push(QtWidgets.QMainWindow):
def __init__(self):
super(Push, self).__init__()
print('now connecting...')
self.connect_server()
def connect_server(self):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.server_socket.connect(('127.0.0.1', 5555))
self.message_monitor = ListeningThread(self.server_socket)
self.message_monitor.mysignal.connect(self.init_UI)
self.message_monitor.start()
except:
Push()
def init_UI(self, message):
print(message)
app =QtWidgets.QApplication([])
application = Push()
sys.exit(app.exec_())
我在 ListeningThread 中尝试过:
class ListeningThread(QtCore.QThread):
mysignal = QtCore.pyqtSignal(str)
def __init__(self, server_socket, parent=None):
QtCore.QThread.__init__(self, parent)
self.server_socket = server_socket
self.message = None
def run(self):
try:
while not self.isInterruptionRequested():
self.message = self.server_socket.recv(4096)
self.mysignal.emit(self.message.decode('utf-8'))
except:
print('error in thread')
self.requestInterruption()
self.wait()
Push()
但问题还是一样。 我想我应该在 Push.connect_server 开始之前关闭线程,但我不知道如何。
对于最小的可重现示例,您可以使用该服务器:
import socket
import threading
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 5555))
server_socket.listen()
clients = []
def accept_socket():
while True:
client_socket, addr = server_socket.accept()
print(f'connection from {addr}')
print(client_socket)
if client_socket not in clients:
clients.append(client_socket)
def sending_message(clients, data):
for client_socket in clients:
try:
client_socket.send(data.encode("utf-8"))
except:
pass
accept_thread = threading.Thread(target= accept_socket)
accept_thread.start()
while True:
data = input('Enter_message:\n')
sending_message(clients, data)
【问题讨论】:
-
@eyllanesc 我添加了一个简单的服务器示例。我还为客户端编辑了最小的可重现示例(第一个带有代码的窗口)。在客户端应用程序中,出现错误“QThread:在线程仍在运行时被破坏”。谢谢你的评论!
标签: python python-3.x sockets pyqt5 qthread