コード例 #1
0
ファイル: ServerBackend.py プロジェクト: suiody/graduate_demo
class ServerBackend(object):
    def __init__(self):
        self.uiSocketServer = socket(AF_INET, SOCK_STREAM)
        self.uiSocketServer.bind(('0.0.0.0', 12347))
        self.uiSocketServer.listen(5)
        self.ctlChannel = ServerControl()
        self.ctlChannel.Start()
        self.stop = False
        self.typeID = -1

    def AcceptUISocket(self):
        try:
            while not self.stop:
                rr, rw, err = select.select([self.uiSocketServer], [], [], 1)
                if rr:
                    (uiSocket, addr) = self.uiSocketServer.accept()
                    print "receive one ui ", addr
                    oneThread = threading.Thread(target=self.DealWithUICommand, args=[uiSocket])
                    oneThread.start()
        except KeyboardInterrupt:
            pass 
        self.uiSocketServer.close()
        self.ctlChannel.Stop()

    def Stop(self):
        self.stop = True
        self.StopClientGenerate()
        self.StopEstServer()
    
    def StartClientGenerate(self):
        print 'start client generate'
        self.clientGenerate = Client() 
        self.clientThread = threading.Thread(target = self.clientGenerate.work, args=())
        self.clientThread.start()

        self.SetClientType(1)
        
    def StartEstServer(self):
        print 'start est server'
        self.estServer = EstServer() 
        self.estServerThread = threading.Thread(target = self.estServer.listen, args=())
        self.estServerThread.start()

    def StopEstServer(self):
        print 'stop est server'
        self.estServer.stop()
        self.estServerThread.join()


    def StopClientGenerate(self):
        print 'stop client generate'
        self.clientGenerate.stop()
        self.clientThread.join()

    def SetClientType(self, typeID):
        if self.typeID == typeID:
            return
        self.typeID = typeID
        self.ctlChannel.typeID = typeID
        if typeID == 1:
            self.clientGenerate.SetParam(3, 62)
        elif typeID == 2:
            self.clientGenerate.SetParam(3.3, 72)
        else:
            self.clientGenerate.SetParam(3.6, 95)

    def DealWithUICommand(self, uiSocket):
        while True:
            command = RecvFixLen(uiSocket, 1)
            command = struct.unpack("!B", command)[0]
            if command == GetFreeDataChannel:
                print "get free data channel"
                number = self.ctlChannel.GetFreeDataChannelNumber()
                content = struct.pack("!BB", GiveFreeDataChannel, number)
            elif command == GetAllActiveClient:
                print " get all active client"
                clients = self.ctlChannel.clients
                print clients
                reqNumber = 0
                content = ''
                for clientMac, client in clients.items():
                    for reqID, req in client.reqs.items():
                        reqNumber += 1
                        content += struct.pack("!BIf", clientMac, reqID, req.allocFreqWidth)
                content = struct.pack("!BI", GiveAllActiveClient, reqNumber) + content
            elif command == GetOneActiveClient:
                print "Get One Active Client"
                content = RecvFixLen(uiSocket, 5)
                (mac, reqID) = struct.unpack("!BI", content)
                client = self.ctlChannel.GetOneClient(mac)
                if client != None:
                    req = client.GetOneReq(reqID)
                    if req != None:
                        content = struct.pack("!Bff", mac, req.midFreq, allocFreqWidth)
                    else:
                        content = struct.pack("!B", Error)
                else:
                    content = struct.pack("!B", Error)
            elif command == GetClientGenerateInfoCom:
                print 'get client generate info'
                (averageSerTime, inputrate) = (1.0/self.clientGenerate.serviceTimeLamb, self.clientGenerate.inputTimeLamb)
                content = struct.pack("!Bff", GiveClientGenerateInfoCom, averageSerTime, inputrate)
            elif command == GetEstParam:
                print "Get est param"
                (averageServiceTime, inputrate) = (self.estServer.est_serviceTime, self.estServer.est_lambda)
                content = struct.pack("!Bff", GiveEstParam, averageServiceTime, inputrate)

            elif command == SetClientParam:
                print "Set client param"
                content = RecvFixLen(uiSocket, 1)
                typeID = struct.unpack("!B", content)[0]
                self.SetClientType(typeID)
                content = ''

            elif command == GetServerInfoCom:
                print "get server info"
                (maxFreq, freeFreq, nowSatis, activeNum, servedNum) = self.estServer.GetServerInfo()

                content = struct.pack("!BfffIII", GiveServerInfoCom, maxFreq, freeFreq, nowSatis, activeNum, servedNum, self.typeID)

            elif command == End:
                break
            else:
                content = struct.pack("!B", Error)
            if len(content) > 0:
                uiSocket.send(content)