与PJSUA2一起使用时,针对Python3.6 socket.recv()观察到的阻止行为

时间:2019-03-06 13:34:42

标签: python-3.x sockets pjsip pjsua2

Namaste Reader,

我们正在研究使用套接字编程的客户端服务器通信机制。 PJSUA2呼叫状态(呼叫应答,呼叫保持,呼叫断开等)在客户端进行处理,具体取决于我们从服务器收到的自定义命令。

例如,如果服务器发送“ cmd_answer”,则客户端将执行代码语句“ call_prm.statusCode = 200”和“ call.answer(call_prm)”。

我创建了一个额外的线程来单独管理套接字通信。在该方法内部,我正在使用PJSUA2将线程注册为'endpoint.libRegisterThread(“ clientSocketCommunication”)'。

套接字通信的示例代码如下:

def clientSocketCommunication:
    endpoint.libRegisterThread("clientSocketCommunication")
    ...
    ...

    while True:
        data = socket_client.recv(1024)

        # Parse data into object
        obj = json.loads(data.decode())
        print(obj)

        if obj['cmd'] == 'call_answer':
            call_prm.statusCode = 200
            call.answer(call_prm)
            print("Call answered")
        elif obj['cmd'] == 'call_end':
            call_prm.statusCode = 200
            call.hangup(call_prm)
            print("Call ended")
            break

因此,除了主要的PJSUA2应用程序之外,这个新创建的用于客户端服务器通信的线程现在可以并行运行。

采用这种逻辑,即使套接字服务器向套接字客户端发送消息后,程序仍会在以下语句中无限期停止。

data = socket_client.recv(1024)

端点是PJSUA2端点的对象,而socket_client是Python3的socket.socket()的对象。

请求协助以解决此问题。因为我是Python和PJSUA2的新手,所以请寻求支持。

谢谢!问候

迪彭

0 个答案:

没有答案