# -*- coding:utf-8 -*-
import sys,os,time
reload(sys)
sys.setdefaultencoding("utf-8")
from multiprocessing import Process, Queue, Pipe
from multiprocessing.connection import  Listener,Client
import json

class ProcessSync():
    HEAD = "[ProcessCMD]"
    def __init__(self):
        pass

    def notifyMessage(self, msg):
        sendMsg = ProcessSync.HEAD + msg
        print sendMsg

class QueueBinder():
    def __init__(self, sender, receiver):
        self.sender = sender
        self.receiver = receiver

    def setQueue(self, sendQue, recvQue):
        self.sender = sendQue
        self.receiver = recvQue

    """
    参数:action:字符串
          data:字典,存放基本数据类型
    """
    def sendData(self, action, data):
        packet = [action,data]
        self.sender.put(packet)

    """
    返回值:数组[action, data]
            data:字典,存放基本数据类型
    """
    def accept(self):
        return self.receiver.get()

queBinder = None
def getQueueBinder(sendQue, recvQue):
    global queBinder
    if (queBinder == None):
        queBinder = QueueBinder(sendQue, recvQue)
    else:
        queBinder.setQueue(sendQue,recvQue)
    return queBinder

def testP1():
    binder = HttpConsoleBinder()
    binder.initConsoleListener()
    print "Wait http"
    action,data = binder.acceptHttp()
    print "testP1,action:",action,";data:",data
    print "Send to http"
    binder.sendToHttp("test", {"keyP1": "valueP1"})

def testP2():
    binder = HttpConsoleBinder()
    binder.initHttpListener()
    print "Send to console"
    binder.sendToConsole("test", {"keyP2":"valueP2"})
    print "Wait console"
    action,data = binder.acceptConsole()
    print "testP2,action:",action,";data:",data

class HttpConsoleBinder():
    HttpServer_Port = 6000
    Console_Port = HttpServer_Port + 1
    def __init__(self):
        self.httpAddress = ("localhost", HttpConsoleBinder.HttpServer_Port)
        self.consoleAddress = ("localhost", HttpConsoleBinder.Console_Port)

    def initHttpListener(self):
        self.httpListener = Listener(self.httpAddress, authkey="password")

    def initConsoleListener(self):
        self.consoleListener = Listener(self.consoleAddress, authkey="password")

    def sendToHttp(self,action, data):
        self.httpClient = Client(self.httpAddress, authkey="password")
        data["action"] = action
        jsonStr = json.dumps(data)
        try:
            self.httpClient.send(jsonStr)
        except Exception,e:
            print e
        finally:
            self.httpClient.close()

    def sendToConsole(self, action, data):
        self.consoleClient = Client(self.consoleAddress, authkey="password")
        data["action"] = action
        jsonStr = json.dumps(data)
        try:
            self.consoleClient.send(jsonStr)
        except Exception,e:
            print e
        finally:
            self.consoleClient.close()

    def acceptHttp(self):
        conn = self.consoleListener.accept()
        data = conn.recv()
        dataDict = json.loads(data)
        action = dataDict["action"]
        conn.close()
        return action,dataDict

    def acceptConsole(self):
        conn = self.httpListener.accept()
        data = conn.recv()
        dataDict = json.loads(data)
        action = dataDict["action"]
        conn.close()
        return action,dataDict

if __name__ == "__main__":
    p1 = Process(target=testP1, args=())
    p1.start()
    time.sleep(3)
    p2 = Process(target=testP2, args=())
    p2.start()