Python 套接字 : Send/receive multiple message

标签 python python-2.7 sockets

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

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

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

我已经完成了Agent上的数据采集功能。我为每种信息编写函数。 Exp : OS() 用于操作系统信息,DISK() 用于磁盘使用信息 ....

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

我想我应该一个一个地发送每个列表,以便于将数据类型改回列表。我打算在 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 上的多个列表发送给 Manager 的建议。如果您有示例代码,那就太好了。 非常感谢, 广

最佳答案

我建议您创建一个 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了解套接字是字节流,而不是消息流。

关于Python 套接字 : Send/receive multiple message,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49443973/

相关文章:

javascript - 我可以使用网络浏览器和javascript来实现客户端socket程序吗

sockets - 为什么 skb_buffer 需要跳过 20 个字节才能在数据包输入时读取传输缓冲区?

python - 从自己的类调用 iPyWidgets 不显示

python - 如何使用scrapy处理escaped_fragment

python - 是否可以使用 argparse 将正则表达式字符串作为参数传递给 Python CLI 工具?

python - 在Python中循环列表时如何避免覆盖SQL UPDATE语句?

python3 将字符串传递给子进程的标准输入的问题

python - 有人可以解释一下这些 Python 字符串格式化程序吗

Python 2.7 仍在访问 Python 3.4 目录

java - 理解 Netty 对线程的使用