当应用程序在 gtk.main() 中为 运行 时,如何监听套接字?
How to listen socket, when app is running in gtk.main()?
我试过搜索,但似乎无济于事。例如:
Separate threads
我目前正在使用 PyGTK 在 Python2.7 中编写简单的通信应用程序。我有后台进程,它正在 while 循环中监听套接字。当我从服务器收到消息时,我想显示消息。但是当我开始 gtk.main() 时,它显然又开始循环了,所以我的监听循环不起作用。我需要为每条消息显示新的 window 或关闭旧的 window 并显示所有未读消息的新的 window。我能否以某种方式显示 window(或多个 window)并且不阻塞我的收听循环?
IOChannel解决方案
while True: #listening loop
print 'Start'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind((socket.gethostname(), 80))
sock.listen(2)
conn, address = sock.accept()
conn.sendall('200 OK')
fd = conn.fileno() #Make file descriptor from socket
gio_channel = glib.IOChannel(fd) #Pass it to IOChannel
if(new_message):
#display message with gtk.main()
else
#Do something else like update file
subprocess.Popen解法
while True: #listening loop
print 'Start'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind((socket.gethostname(), 80))
sock.listen(2)
conn, address = sock.accept()
conn.sendall('200 OK')
all_json = conn.recv(2048)
if(new_message):
# This script run pygtk app in the background
subprocess.Popen(['python', 'communication_app.py'])
else
#Do something else like update file
您可能想尝试使用 GLib 的 GIOChannel
(Python 文档中的 GLib.IOChannel)将套接字作为事件源处理(GSource
) .然后使用g_io_create_watch
(Python中的GLib.IOChannel.add_watch
)集成到GTK+主循环中。
- https://lazka.github.io/pgi-docs/#GLib-2.0/classes/IOChannel.html#GLib.IOChannel
- https://developer.gnome.org/glib/stable/glib-IO-Channels.html
Gio
库中还有很多更高级的套接字处理内容:
- https://lazka.github.io/pgi-docs/#Gio-2.0
- https://developer.gnome.org/gio/stable/(参见 "Low-level network support" 和 "High-level network functionallity" 部分)
我试过搜索,但似乎无济于事。例如:
Separate threads
我目前正在使用 PyGTK 在 Python2.7 中编写简单的通信应用程序。我有后台进程,它正在 while 循环中监听套接字。当我从服务器收到消息时,我想显示消息。但是当我开始 gtk.main() 时,它显然又开始循环了,所以我的监听循环不起作用。我需要为每条消息显示新的 window 或关闭旧的 window 并显示所有未读消息的新的 window。我能否以某种方式显示 window(或多个 window)并且不阻塞我的收听循环?
IOChannel解决方案
while True: #listening loop
print 'Start'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind((socket.gethostname(), 80))
sock.listen(2)
conn, address = sock.accept()
conn.sendall('200 OK')
fd = conn.fileno() #Make file descriptor from socket
gio_channel = glib.IOChannel(fd) #Pass it to IOChannel
if(new_message):
#display message with gtk.main()
else
#Do something else like update file
subprocess.Popen解法
while True: #listening loop
print 'Start'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind((socket.gethostname(), 80))
sock.listen(2)
conn, address = sock.accept()
conn.sendall('200 OK')
all_json = conn.recv(2048)
if(new_message):
# This script run pygtk app in the background
subprocess.Popen(['python', 'communication_app.py'])
else
#Do something else like update file
您可能想尝试使用 GLib 的 GIOChannel
(Python 文档中的 GLib.IOChannel)将套接字作为事件源处理(GSource
) .然后使用g_io_create_watch
(Python中的GLib.IOChannel.add_watch
)集成到GTK+主循环中。
- https://lazka.github.io/pgi-docs/#GLib-2.0/classes/IOChannel.html#GLib.IOChannel
- https://developer.gnome.org/glib/stable/glib-IO-Channels.html
Gio
库中还有很多更高级的套接字处理内容:
- https://lazka.github.io/pgi-docs/#Gio-2.0
- https://developer.gnome.org/gio/stable/(参见 "Low-level network support" 和 "High-level network functionallity" 部分)