gpt4 book ai didi

python - 从服务器发送消息时出现 SocketIO "packet queue is empty, aborting” 错误

转载 作者:行者123 更新时间:2023-12-02 18:53:37 54 4
gpt4 key购买 nike

我在从 WSGI 服务器向 SocketIO 客户端发送 SocketIO 消息时遇到问题。以其他方式(客户端到服务器)的消息工作正常,没有任何问题。代码在 Python 中,使用 python-socketio 包和 eventlet 创建 WSGI 服务器。服务器和客户端在同一台 Windows 机器上的不同控制台中运行。通过单击按钮发送消息。

这是发生了什么:

  1. 在一个控制台中,服务器启动,一个带有按钮的窗口(发送消息)出现。
  2. 在另一个控制台中,客户端启动。一个窗口有两个按钮出现——一个按钮启动与服务器的连接另一个按钮发送消息。
  3. 点击客户端的“连接”按钮并建立连接没有问题。
  4. 客户端的“发送消息”按钮被点击,发送的数据为打印在服务器的控制台中(这完全可以正常工作)
  5. 服务器的“发送消息”按钮被点击。在客户端控制台中,一段时间内什么也没有发生(我假设服务器再次轮询时)然后执行客户端的 disconnect() 函数(这不是什么是预期的)

根据服务器的客户端是否发送第一条消息,客户端控制台显示的消息略有不同。

  • 如果服务器发送第一个消息,那么当客户端发送它只是来自 disconnect() 函数的打印语句的消息显示出来。
  • 如果客户端发送第一个消息,那么当服务器向它发送消息时,“packet queue是空的,正在中止”显示在打印语句之后disconnect() 函数。

为什么客户端收不到服务器发出的消息?

这是体现问题的完整服务器和客户端代码:

服务器代码:

from PyQt5.QtWidgets import QPushButton, QDialog, QApplication
import socketio, sys, eventlet
from threading import Thread

class My_Class(QDialog):

def __init__(self, parent=None):
super(My_Class, self).__init__(parent)

self.setWindowTitle("My SocketIO Server")
self.resize(300,150)
self.move(300, 200)

self.btn1 = QPushButton(self)
self.btn1.setText('Send Msg')
self.btn1.move(100,75)
self.btn1.clicked.connect(send_message_to_client)

self.show()

if __name__ == '__main__':

sio = socketio.Server(async_mode='eventlet')

def start_listening():
eventlet.wsgi.server(eventlet.listen(('', 5000)), serverapp)

@sio.event
def connect(sid, environ):
print('\nConnected with SID', sid)

def send_message_to_client():
print('\nSending from Button')
sio.emit('Message_from_server', {"Message 1": "Hello"})

@sio.event
def message_from_client(sid, data):
print('\nThis message came from the Client.', data, '\n')

serverapp = socketio.WSGIApp(sio, static_files={'/': {'content_type': 'text/html', 'filename': 'index.html'}})
thread = Thread(target = start_listening, args=())
thread.start()

app = QApplication(sys.argv)
form = My_Class()
form.show()
sys.exit(app.exec_())

这是客户端代码:

from PyQt5.QtWidgets import QPushButton, QDialog, QApplication
import socketio, sys

class My_Client(QDialog):

def __init__(self, parent=None):
super(My_Client, self).__init__(parent)

self.setWindowTitle("My SocketIO Clent")
self.resize(300,150)
self.move(700, 200)

self.btn1 = QPushButton(self)
self.btn1.setText('connect')
self.btn1.move(50,75)
self.btn1.clicked.connect(connect)

self.btn2 = QPushButton(self)
self.btn2.setText('Send Msg')
self.btn2.move(175,75)
self.btn2.clicked.connect(send_message_from_client)

self.show()

if __name__ == '__main__':

sio = socketio.Client()

def connect():
sio.connect('http://localhost:5000')
print('\nConnection established using SID', sio.sid)

@sio.event
def message_from_server(sid, data):
print('\nMessage from server received with ', data)

def send_message_from_client():
print('\nMessage sent from Client')
sio.emit('message_from_client', {'Message': 'Hello World'})

@sio.event
def disconnect():
print('\nDisconnected from server\n')

app = QApplication(sys.argv)
form = My_Client()
form.show()
sys.exit(app.exec_())

最佳答案

我在使用 socketio.asyncServer 时遇到了同样的问题。问题是我的服务器的 pingTimeout 太小(5 秒)。pingTimeout 是客户端在断开连接之前等待服务器响应的时间(以秒为单位),默认情况下它设置为 5 秒。将超时间隔增加到 60 秒,为我解决了这个问题。在服务器代码中,更改

sio = socketio.Server(async_mode='eventlet')

以下内容

sio = socketio.Server(async_mode='eventlet', ping_timeout=60)

sio = socketio.AsyncServer(ping_timeout=60)

关于python - 从服务器发送消息时出现 SocketIO "packet queue is empty, aborting” 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66441954/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com