Python Socket:发送/接收多条消息

时间:2018-03-23 06:52:27

标签: python python-2.7 sockets

我用两个模块编写了一个应用程序。

  1. 代理:收集有关计算机资源的信息并发送给Manager。

  2. 经理:从客户端收听数据并写入数据库。

  3. 我已完成Agent上的收集数据功能。我为每种信息编写函数。 Exp : OS() for Operating System information, DISK() for Disk used information ....

    每个函数返回一个包含信息的列表。我想将这些列表发送给Manager。但是当向Manager发送数据时我必须将数据类型更改为字符串。

    我想我应该逐个发送每个列表,以便我将数据类型更改回列表。我计划在Agent和Manager上编写for循环来发送/接收数据。

    代理人:

    resource_info = [OS(), CPU(), DISK(), MEMORY(), NETWORK(), FIREWALL()]
    
    try:
        for x in resource_info:
            s.sendall(str(x))
    except socket.error, e:
        print "Error sending data: %s" % e
        sys.exit(1)
    
    # Close Socket
    s.close()
    

    经理:

    s.listen(10)
    for x in range(0,4):
        if x == 0 :
            conn, addr = s.accept()
            OS = conn.recv(100000)
        if x == 1 :
            conn, addr = s.accept()
            DISK = conn.recv(100000)
        if x == 2 :
            conn, addr = s.accept()
            MEMORY = conn.recv(100000)
        ....
    
    OS = OS.split(",")
    DISK = DISK.split(",")
    ....
    

    但我认为这是一种愚蠢的方式。请给我一些关于如何在Agent上发送多列表的建议。如果你有简单的代码,那就太好了。 非常感谢, 广

1 个答案:

答案 0 :(得分:1)

我建议您创建一个sudo snap switch node --edge ,将每个资源映射到相应的信息,而不是创建dict

list

将此数据发送到套接字的更简洁方法是使用pickle。 使用pickle,您可以序列化Python对象。

resource_info = {
  'OS': [...],
  'DISK': [...]
}

在管理器上,您可以接受字节并使用import pickle data = pickle.dumps({'foo': 'bar'}) 对其进行反序列化。

pickle.loads(...)

您可以查看this答案,了解示例实施情况。

我还建议阅读this blogpost以了解套接字是字节流,而不是消息流。