Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行D总线环路时的非确定性插座连接_Python_Linux_Sockets_Dbus - Fatal编程技术网

Python 运行D总线环路时的非确定性插座连接

Python 运行D总线环路时的非确定性插座连接,python,linux,sockets,dbus,Python,Linux,Sockets,Dbus,我为Rhythmbox创建了一个小型web界面,其后端使用该界面与播放器进行交互。方法和属性工作得很好,但我无法让信号部分(需要运行循环)按我希望的方式运行 我的想法是,我有一个运行的守护进程,可以连接到使用TCP,它发送事件使用的格式。问题是连接的处理非常奇怪,客户机立即获得连接,但是守护进程中产生的客户机套接字通常会在很久之后处理,如果它被处理的话 以下是守护进程的代码: #!/usr/bin/env python local_port = 9001 import socket impo

我为Rhythmbox创建了一个小型web界面,其后端使用该界面与播放器进行交互。方法和属性工作得很好,但我无法让信号部分(需要运行循环)按我希望的方式运行

我的想法是,我有一个运行的守护进程,可以连接到使用TCP,它发送事件使用的格式。问题是连接的处理非常奇怪,客户机立即获得连接,但是守护进程中产生的客户机套接字通常会在很久之后处理,如果它被处理的话

以下是守护进程的代码:

#!/usr/bin/env python

local_port = 9001

import socket
import thread
import sys
import os
import json
import subprocess
import shlex
import dbus
import dbus.mainloop.glib
import glib
import threading

def dbus_thread(lock, client_connections):
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
    dbus.mainloop.glib.threads_init()

    bus = dbus.SessionBus()
    player_path = "org.mpris.MediaPlayer2.Player"
    player_proxy = bus.get_object ("org.gnome.Rhythmbox3", "/org/mpris/MediaPlayer2")
    player = dbus.Interface(player_proxy, player_path)

    def sendToClients(message):
        lock.acquire()
        try:
            for client_connection in client_connections:
                socket, addr = client_connection
                print "Sending message to " + str(addr) + "..."
                try:
                    socket.sendall(message)
                except:
                    print "Client dropped:", addr
                    client_connections.remove(client_connection)
        finally:
            lock.release()

    def handleSeeked(position):
        print "Seeked event:", position
        sendToClients("event: Seeked\ndata: { 'position:' " + str(position) + " }\n\n")

    player.connect_to_signal("Seeked", handleSeeked)
    glib.MainLoop().run()

if __name__ == '__main__':
    print "Daemon PID:", os.getpid()
    server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    server.bind(('localhost', local_port))
    server.listen(10)
    print "Server listening on:", server.getsockname()

    lock = threading.Lock()
    client_connections = [];

    thread.start_new_thread(dbus_thread, (lock, client_connections))

    while True:
        print "Waiting for client connection..."
        client_connection = server.accept()
        print "Client connected:", client_connection[1]
        sys.stdout.flush()
        lock.acquire()
        try:
            client_connections.append(client_connection)
        finally:
            lock.release()
基本程序是:

  • 创建可以接受连接的服务器套接字
  • 创建存储连接的客户端的列表
  • 创建运行D-Bus循环的后台线程
    • 如果信号进入,则将事件数据写入所有活动连接
  • 启动一个接受客户机并将其添加到列表中的循环
线路

client_connection = server.accept()
执行得很好,从客户端获得连接判断,但之后的行只会在很长一段时间后执行,如果:

print "Client connected:", client_connection[1]

也许是D-Bus线程的干扰,我不知道。如果您对如何解决此问题有任何建议,我们将不胜感激。

当不涉及DBus时,
server.accept()
是否及时完成?如果您编写了一个简单的测试脚本来测试它的响应性,它是令人满意的?@JB0x2D1:
server.accept
工作得很好,否则,我还有一些其他web应用程序也在使用它,并且没有任何问题。也许选择端口9001?显然@JB0x2D1:当您尝试绑定到已在使用的套接字时,会出现错误。除了非常重要的低编号端口(21、22、80等)之外的任何端口通常不会在大多数系统中日常使用。