ZMQ
ZMQ Community : http://zeromq.org/community
zguide:http://zguide.zeromq.org/page:all
pyzmq
pyzmq安装包:
https://pypi.python.org/pypi/pyzmq
pyzmq API: http://zeromq.github.io/pyzmq/
http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/#
Server端
#! /usr/bin/env python
#coding=utf-8
import time
import zmq
from zmq.eventloop import ioloop,zmqstream
import json
import optionalSearch
import pymongo
import random
from threading import Thread
from Queue import Queue
"""
ioloop.install() must be called prior to instantiating *any* tornado objects,
and ideally before importing anything from tornado, just to be safe.
install() sets the singleton instance of tornado.ioloop.IOLoop with zmq's
IOLoop. If this is not done properly, multiple IOLoop instances may be
created, which will have the effect of some subset of handlers never being
called, because only one loop will be running.
"""
ioloop.install()
import tornado
import tornado.web
port = "5556"
queue = Queue(50)
conn = pymongo.Connection("localhost",27017)
db = conn.processMonitor
systemStatue = db.systemStatue
class Producer(Thread):
def run(self,):
global queue
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:%s" % port)
while True:
msg = socket.recv()
socket.send("from server:has recieved...")
systemInfo = json.loads(msg)
print type(systemInfo)
queue.put(systemInfo)
print "Produced..."
time.sleep(random.random())
class Consumer(Thread):
def run(self,):
global queue,systemStatue
while True:
msg = queue.get()
queue.task_done()
print "Consumed::",msg
#存储客户机监控信息
systemStatue.insert(msg)
#搜素算法(最优二叉查找树)
optionalSearch.monitorClientStatue(msg)
time.sleep(random.random())
# def zmq_rep():
# """用于接收数据"""
# context = zmq.Context()
# socket = context.socket(zmq.REP)
# socket.bind("tcp://*:%s" % port)
# while True:
# msg = socket.recv()
# print msg
# socket.send("from server:has recieved...")
if __name__ == '__main__':
#zmq_rep()
# worker = threading.Thread(target=zmq_rep)
# worker.start()
Producer().start()
Consumer().start()
客户端
#! /usr/bin/env python
#coding=utf-8
'''
version:1.0
监控windows信息:CPU占有率,内存占有率,端口开放情况,当前进程名称
数据格式: [{'IP':getIp(),'CPUstate':getCPUState(),'Memorystate':getMemoryState(),
'PortState':getPortState(),'ProcessName':getProcessName()},{},...]
'''
import time
import zmq
import psutil
import socket
import json
port = "5556"
server_addr = "192.168.116.133"
'''
获取被监控客户机的基本状态
'''
class MachineStatue:
def _getHostName(self,):
self._hostname = socket.getfqdn(socket.gethostname())
return self._hostname
def _getIP(self,):
return socket.gethostbyname(self._hostname)
def _getCPUState(self, interval=1):
return psutil.cpu_percent(interval)
def _getProcessInfo(self,):
proc_pids = psutil.pids()
proc_name = []
for pid in proc_pids:
proc = psutil.Process(pid)
proc_name.append(proc.name())
return zip(proc_pids,proc_name)
def getInfo(self,):
hostname = self._getHostName()
ip = self._getIP()
CPUState = self._getCPUState()
processInfo = self._getProcessInfo()
info = {'hostname':hostname,'ip':ip,'CPUState':CPUState,'processInfo':processInfo}
return info
def main():
print 'begin'
machineStatue = MachineStatue()
context = zmq.Context()
req_socket = context.socket(zmq.REQ)
print req_socket
req_socket.connect("tcp://%s:%s"%(server_addr,port))
while True:
package = machineStatue.getInfo()
req_socket.send(json.dumps(package))
print "sending..."
rev_info = req_socket.recv(copy=False)
print rev_info
time.sleep(5)
if __name__ == '__main__':
main()