处理无阻塞套接字服务结果的最佳方法

时间:2016-12-29 02:48:37

标签: python sockets networking network-programming

我想与代理软件交谈,这里是official socket example

此软件会每10秒向连接的cli发送流量统计信息。我还需要在同一个连接上发送命令并获取命令结果。

我花了一些时间才弄清楚我无法创建两个套接字客户端并连接到同一个服务器以获得不同的结果。

我的问题:如何在录制流量统计信息时管理用户配置?

测试:

添加端口时,会在几个ok之后获得cli.recv(1506)(因为统计信息每10秒发送一次,因此我不会一直读取,ok会落后很多stat):

>>> cli.send(b'add: {"server_port":8003, "password":"123123"}')
46

>>>  print(cli.recv(1506))
stat: {"8002":164}

>>> print(cli.recv(1506))
stat: {"8002":336}

>>> print(cli.recv(1506))
ok

>>> print(cli.recv(1506))
stat: {"8002":31}

>>> print(cli.recv(1506))
# hang here wait for next result

因此,如果我发送许多命令,我无法识别哪个结果映射哪个命令。

我想出的解决方案是:

# client main code

while True:
    # need open another sock port to recieve command
    c = self.on_new_command()
    if c:
        self.cli.send(c)
        # does python socket server ensure response is FIFO when `setblocking(False)`
        self.queue.append(c)

    ret = self.cli.recv(1524)

    if 'stat' in ret:
        self.record(ret)
    else :
        self.log(self.queue.pop(), ret)

我需要打开另一个sock端口来接收这个客户端的命令,并且必须编写另一个发送命令的客户端...我觉得它不好。

因为这是我第一次使用套接字编程,我的解决方案是否适合这种情况?有没有更好的方法来实现我的目标?

0 个答案:

没有答案