我写了一个有两个模块的应用程序。
代理:收集有关计算机资源的信息并发送给管理器。
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/