[英]ValueError from socketserver on close event using PySide2
I found this answer the other day when trying to figure out a way to send data to an already running instance of PyQt and it works well but I was just messing around with PySide2 and tried the code and it gives an error when closing. 前几天,当我试图找出一种将数据发送到已经运行的PyQt实例的方法时,我找到了这个答案 ,并且效果很好,但是我只是在弄混PySide2并尝试了代码,关闭时给出了错误。 It works completely fine with PyQt5 but it gives the same error on closing with PySide and PySide2. 它在PyQt5上可以完全正常工作,但是在使用PySide和PySide2关闭时会给出相同的错误。 Anyone know why that is? 有人知道为什么吗? It says it's a ValueError but I can't figure it out. 它说这是一个ValueError,但我不知道。 I am using Python 3.6. 我正在使用Python 3.6。
Client.py 客户端
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 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 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_()
Here is the error. 这是错误。
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
Problem solved. 问题解决了。 Had to terminate the thread with 不得不终止线程
self.thread.terminate()
before calling 打电话之前
self.server.server_close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.