我正在开发python中的网络应用程序,它具有zeroconf / avahi,双向UDP连接和Qt接口。 对于我的双向通信,我编写了一个小类,通过UDP连接到远程服务器并继续监听该套接字,以防服务器想要回复。
我真正想要的是,我的网络组件有一个异步接收器,它只是在从对等端到达时运行和发送消息。
最初我使用SocketServer
执行此任务,但我很快发现,一旦我开始运行GUI的主循环,SocketServer
将停止调用RequestHandler
。
所以我研究了一下,找到this,我根据自己的需要调整了它。
不幸的是,一旦数据从服务器到达,我的应用程序就会出现段错误。
这是一个揭示问题的小例子程序:
import sys
import gobject
import socket
from PySide.QtCore import *
from PySide.QtGui import *
def callback(socket, *args):
data, address = socket.recvfrom(8192)
print "data arrived", data
return True
class Client:
def __init__(self, host, port):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.remote = (host, port)
gobject.io_add_watch(self.socket, gobject.IO_IN, callback)
def send(self, data=[]):
self.socket.sendto( data, self.remote)
class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
# widget
self.button = QPushButton("Hello World")
self.button.clicked.connect(self.sayHello)
layout = QVBoxLayout()
layout.addWidget(self.button)
self.setLayout(layout)
self.connection = Client('localhost', 7777)
def sayHello(self):
self.connection.send('hello')
if __name__ == '__main__':
app = QApplication(sys.argv)
form = Form()
form.show()
sys.exit(app.exec_())
我正在使用它:
netcat -u -l -p 7777
现在我想问题是,我正在混合glib和qt,两者都提供类似的功能(就mainloop而言),而gobject.io_add_watch
依赖于运行的glib-mainloop,而是一个Qt主循环。
在PySide / Qt框架内获取异步接收UDP客户端的正确方法是什么? 如果可能的话,我想避免我的网络代码依赖于Qt / PySide,因为我想在嵌入式无头系统(beaglebone)上重复使用它,而Qt在这里似乎有些过分。
答案 0 :(得分:0)
似乎问题很简单:当使用gobject
的非线程时,必须明确地初始化它们。
在“主要”功能的开头添加以下内容可解决此问题:
gobject.threads_init()