[英]ValueError from socketserver on close event using PySide2
前幾天,當我試圖找出一種將數據發送到已經運行的PyQt實例的方法時,我找到了這個答案 ,並且效果很好,但是我只是在弄混PySide2並嘗試了代碼,關閉時給出了錯誤。 它在PyQt5上可以完全正常工作,但是在使用PySide和PySide2關閉時會給出相同的錯誤。 有人知道為什么嗎? 它說這是一個ValueError,但我不知道。 我正在使用Python 3.6。
客戶端
import socket
IP, PORT = '127.0.0.1', 62236
def send(data):
SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SOCKET.connect((IP, PORT))
SOCKET.send(data)
SOCKET.close()
test_text = b'testing'
send(test_text)
Server.py PyQt5
import socketserver as SocketServer
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
IP, PORT = '127.0.0.1', 62236
app = QApplication([])
class Emitter(QObject):
signal = pyqtSignal(str)
class Handler(SocketServer.BaseRequestHandler):
emitter = Emitter()
def handle(self):
self.emitter.signal.emit(self.request.recv(1024).decode('utf-8'))
class Thread(QThread):
def __init__(self, target, parent=None):
QThread.__init__(self, parent)
self.target = target
def run(self):
while True:
self.target()
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
Handler.emitter.signal.connect(self.onEmit)
self.server = SocketServer.TCPServer((IP, PORT), Handler)
thread = Thread(target=self.server.handle_request)
thread.start()
self.setLayout(QVBoxLayout())
self.label = QLabel('somewhere over the rainbow')
self.layout().addWidget(self.label)
self.show()
def closeEvent(self, event):
self.server.server_close()
event.accept()
def onEmit(self, arg):
self.label.setText(str(arg))
dialog = Dialog()
app.exec_()
Server.py PySide2
import socketserver as SocketServer
from PySide2.QtWidgets import *
from PySide2.QtCore import *
IP, PORT = '127.0.0.1', 62236
app = QApplication([])
class Emitter(QObject):
signal = Signal(str)
class Handler(SocketServer.BaseRequestHandler):
emitter = Emitter()
def handle(self):
self.emitter.signal.emit(self.request.recv(1024).decode('utf-8'))
class Thread(QThread):
def __init__(self, target, parent=None):
QThread.__init__(self, parent)
self.target = target
def run(self):
while True:
self.target()
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
Handler.emitter.signal.connect(self.onEmit)
self.server = SocketServer.TCPServer((IP, PORT), Handler)
thread = Thread(target=self.server.handle_request)
thread.start()
self.setLayout(QVBoxLayout())
self.label = QLabel('somewhere over the rainbow')
self.layout().addWidget(self.label)
self.show()
def closeEvent(self, event):
self.server.server_close()
event.accept()
def onEmit(self, arg):
self.label.setText(str(arg))
dialog = Dialog()
app.exec_()
這是錯誤。
Traceback (most recent call last):
File "C:/Users/Rich/PycharmProjects/TestProject/Server.py", line 76, in run
self.target()
File "C:\python36\lib\socketserver.py", line 292, in handle_request
selector.register(self, selectors.EVENT_READ)
File "C:\python36\lib\selectors.py", line 299, in register
key = super().register(fileobj, events, data)
File "C:\python36\lib\selectors.py", line 237, in register
key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data)
File "C:\python36\lib\selectors.py", line 224, in _fileobj_lookup
return _fileobj_to_fd(fileobj)
File "C:\python36\lib\selectors.py", line 41, in _fileobj_to_fd
raise ValueError("Invalid file descriptor: {}".format(fd))
ValueError: Invalid file descriptor: -1
問題解決了。 不得不終止線程
self.thread.terminate()
打電話之前
self.server.server_close()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.