简体   繁体   English

使用PySide2在关闭事件上从socketserver引发ValueError

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM