Alala-- 2019-03-28 15:56 采纳率: 0%
浏览 3749

PyQt5,用QTcpSocket做的服务端。提示QIODevice::write (Start): device not open

图片说明图片说明

PyQt5,用QTcpSocket做的服务端。提示QIODevice::write (Start): device not open。
开了一个tcp调试助手已确定连接形成。但就是使用write()提示QIODevice::write (Start): device not open。如上图:
连接tcp代码:
class TcpSocket(QTcpSocket):
sinshow = pyqtSignal(str)
def init(self):
super().__init__()
self.tcpServer = QTcpServer(self)
self.abc = QTcpSocket(self)
self.tcpServer.newConnection.connect(self.link)
self.tcpServer.listen(QHostAddress.Any, PORT)#监听ip
def link(self):
self.abc = self.tcpServer.nextPendingConnection()
self.readyRead.connect(self.showMessage)
print('已连接')
def sendMessage(self,message):
print('发送')
print(self.state())
reply = QByteArray()
stream = QDataStream(reply, QIODevice.WriteOnly)
stream.writeUInt16(0)
stream.writeQString(message)
stream.device().seek(0)
stream.writeUInt16(reply.size() - SIZEOF_UINIT16)
self.write(reply)
print(message)


  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 14:59
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在您的代码中,有一个错误的地方。当您尝试调用write()方法时,您没有将设备设置为写入模式(即使用stream.writeUInt16(SIZEOF_UINIT16))。这会导致device not open错误。以下是修复后的代码:

    class TcpSocket(QTcpSocket):
        sinshow = pyqtSignal(str)
    
        def __init__(self):
            super().__init__()
            self.tcpServer = QTcpServer(self)
            self.abc = QTcpSocket(self)
            self.tcpServer.newConnection.connect(self.link)
            self.tcpServer.listen(QHostAddress.Any, PORT)  # 监听IP地址和端口
    
        def link(self):
            self.abc = self.tcpServer.nextPendingConnection()
            self.readyRead.connect(self.showMessage)
            print('已连接')
    
        def sendMessage(self, message):
            print('发送')
            print(self.state())
            reply = QByteArray()
            stream = QDataStream(reply, QIODevice.WriteOnly)
            stream.writeUInt16(0)
            stream.writeQString(message)
            stream.device().seek(0)
            stream.writeUInt16(reply.size() - SIZEOF_UINIT16)
            self.write(reply)
            print(message)
    

    在这个修复版本的代码中,我添加了stream.writeUInt16(SIZEOF_UINIT16)以确保设备已经打开并准备好接收数据。现在,当您尝试发送消息时,应该不再出现device not open错误。

    评论

报告相同问题?