用python的twisted做个简单游戏服务器原形--客户端连接monitor管理类

'''
Created on 2012-8-14

@author: qs
'''
#from twisted.internet import epollreactor
#epollreactor.install()
from twisted.internet import selectreactor
selectreactor.install()

from twisted.internet.protocol import ClientFactory, Protocol
from twisted.internet import reactor
from buffer import Buffer
import struct
import sys
import threading
from msgqueue import MessageQueue


class Service(Protocol):

    def __init__(self):
        self.index = 0
        self.identify = 0
    
    def connectionMade(self):
        print "new client come!"
        self.factory.service_tick = self.factory.service_tick + 1
        self.identify = self.factory.service_tick
        self.factory.bind_service(self)

        
    def connectionLost(self, reason):
        print "new client lost"
        self.factory.unbind_service(self)
        
    def dataReceived(self, data):
        message = struct.pack('i%ds' % (len(data)),self.identify,data)
        self.factory.push_message(message)
       
        
    def dataSend(self, date):
        self.transport.write(date)
        

            
        
class Monitor(ClientFactory, threading.Thread):
    protocol = Service
    
    def __init__(self):
        threading.Thread.__init__(self)
        self.message_queue = MessageQueue(self)
        self.service_tick = 0
        self.addr = 'localhost'
        self.port = 1989
        
    def clientConnectionFailed(self, connector, reason):
        print "engine connection failed:", reason.getErrorMessage()
        reactor.stop()
        
    def clientConnectionLost(self, connector, reason):
        print "engine connection lost:", reason.getErrorMessage()
        reactor.stop()
        
    def startedConnecting(self, connector):
        print "started connecting engine"
        
    def run(self):
        self.message_queue.start()
#        monitor_reactor = epollreactor.EPollReactor()
        monitor_reactor = selectreactor.SelectReactor()
#        monitor_reactor.connectTCP(self.inet_addr.addr, self.inet_addr.port, self)
        monitor_reactor.listenTCP(self.port, self)
        monitor_reactor.run(installSignalHandlers=False)
        
    def local_addr(self, addr='localhost', port=1989):
        self.addr = addr
        self.port = port
        
    def bind_service(self, service):
        pass
    
    def unbind_service(self, service):
        pass
    
    def find_service(self, id):
        pass
        
    def push_message(self,message):
        self.message_queue.push(message)
        
    def process_message(self, message):
        pass

以上是客房端连接有消息连接来的时候一个一monitor类,里面启动了一个线程让reactor运行,一个message_queue线程用来重组客户端发来的消息。

你可能感兴趣的:(用python的twisted做个简单游戏服务器原形--客户端连接monitor管理类)