【问题标题】:Python Socket : Send/receive multiple messagePython Socket:发送/接收多条消息
【发布时间】:2018-03-23 06:52:26
【问题描述】:

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

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

  2. Manager : 监听来自客户端的数据并写入数据库。

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

每个函数都返回一个包含信息的列表。我想将这些列表发送给经理。但是当向 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(",")
....

但我认为这是一种愚蠢的做法。请给我一些关于如何将代理上的多列表发送给经理的建议。如果您有示例代码,那就太好了。 非常感谢, 广

【问题讨论】:

    标签: python python-2.7 sockets


    【解决方案1】:

    我建议您创建一个dict,将每个资源映射到其相应的信息,而不是创建一个list

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

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

    import pickle
    data = pickle.dumps({'foo': 'bar'})
    

    在管理器上,您可以使用 pickle.loads(...) 接受字节并对其进行反序列化。

    data = s.recv(4096)
    deserialized_data = pickle.loads(data)
    

    您可以查看this 答案以获取示例实现。

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

    【讨论】:

    • 感谢您的帮助。晚安先生! :D
    猜你喜欢
    • 2018-03-31
    • 2016-01-30
    • 2019-08-19
    • 2015-06-28
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多