def __init__(self): self.cManager = QueuedConnectionManager() self.cListener = QueuedConnectionListener(self.cManager, 0) self.cReader = QueuedConnectionReader(self.cManager, 0) self.cWriter = ConnectionWriter(self.cManager, 0) self.rqTable = ServerRequestTable() self.rsTable = ServerResponseTable() self.connection = None
def __init__(self, worldMgr, connectionObj): self.connectionObj = connectionObj if connectionObj.cManager != None: self.cManager = connectionObj.cManager else: self.cManager = QueuedConnectionManager() if connectionObj.cListener != None: self.cListener = connectionObj.cListener else: self.cListener = QueuedConnectionManager() if connectionObj.cReader != None: self.cReader = connectionObj.cReader else: self.cReader = QueuedConnectionManager() if connectionObj.cWriter != None: self.cWriter = connectionObj.cWriter else: self.cWriter = QueuedConnectionManager() if connectionObj.connection != None: self.connection = connectionObj.connection else: self.connection = self.cManager.openTCPClientConnection(Constants.SERVER_IP, Constants.SERVER_PORT, 1000) if self.connection: self.cReader.addConnection(self.connection) self.rqTable = ServerRequestTable() self.rsTable = ServerResponseTable() self.worldMgr = worldMgr self.world = worldMgr.gameWorld
class ConnectionManager: def __init__(self, main): self.main = main self.cManager = QueuedConnectionManager() self.cListener = QueuedConnectionListener(self.cManager, 0) self.cReader = QueuedConnectionReader(self.cManager, 0) self.cWriter = ConnectionWriter(self.cManager, 0) self.rqTable = ServerRequestTable() self.rsTable = ServerResponseTable() self.connection = None def startConnection(self): """Create a connection with the remote host. If a connection can be created, create a task with a sort value of -39 to read packets from the socket. """ if self.connection == None: self.connection = self.cManager.openTCPClientConnection(Constants.SERVER_IP, Constants.SERVER_PORT, 1000) if self.connection: self.cReader.addConnection(self.connection) return True return False def initTasks(self): """Initialize tasks to check on connection and send heartbeat. This must be done here because in `Main` we do not initialize Panda3D until after a connection is started. Thus, `taskMgr` is not defined when `startConnection()` is called. We rely on the callee to also run `initTasks()` after a successful connection is created. """ if self.connection != None: taskMgr.add(self.updateRoutine, "updateRoutine-Connection") taskMgr.doMethodLater(5, self.checkConnection, "checkConnection") taskMgr.doMethodLater(1.0 / Constants.TICKRATE, self.sendHeartbeat, "sendHeartbeat") def closeConnection(self): """Close the current connection with the remote host. If an existing connection is found, remove both the Main task, which is responsible for the heartbeat, and the Connection task, which is responsible for reading packets from the socket, then properly close the existing connection. """ if self.connection != None: taskMgr.remove("updateRoutine-Connection") taskMgr.remove("checkConnection") self.cManager.closeConnection(self.connection) self.connection = None def sendRequest(self, requestCode, args={}): """Prepare a request packet to be sent. If the following request code exists, create an instance of this specific request using any extra arguments, then properly send it to the remote host. """ if self.connection != None: request = self.rqTable.get(requestCode) if request != None: request.set(self.cWriter, self.connection) request.send(args) def handleResponse(self, responseCode, data): """Prepare a response packet to be processed. If the following response code exists, create an instance of this specific response using its data to be executed. """ response = self.rsTable.get(responseCode) if response != None: response.set(self.main) response.execute(data) def checkConnection(self, task): if not self.cReader.isConnectionOk(self.connection): self.closeConnection() self.showDisconnected(0) return task.done return task.again def updateRoutine(self, task): """A once-per-frame task used to read packets from the socket.""" while self.cReader.dataAvailable(): # Create a datagram to store all necessary data. datagram = NetDatagram() # Retrieve the contents of the datagram. if self.cReader.getData(datagram): # Prepare the datagram to be iterated. data = PyDatagramIterator(datagram) # Retrieve a "short" that contains the response code. responseCode = data.getUint16() # Pass into another method to execute the response. if responseCode != Constants.MSG_NONE: self.handleResponse(responseCode, data) return task.cont def sendHeartbeat(self, task): if self.connection != None: self.sendRequest(Constants.C_HEARTBEAT) return task.again
class ConnectionManager: def __init__(self, main): #self.world = world self.cManager = QueuedConnectionManager() self.cListener = QueuedConnectionListener(self.cManager, 0) self.cReader = QueuedConnectionReader(self.cManager, 0) self.cWriter = ConnectionWriter(self.cManager, 0) self.main = main self.rqTable = ServerRequestTable() self.rsTable = ServerResponseTable() self.connection = None def startConnection(self): """Create a connection with the remote host. If a connection can be created, create a task with a sort value of -39 to read packets from the socket. """ try: if self.connection == None: self.connection = self.cManager.openTCPClientConnection(Constants.SERVER_IP, Constants.SERVER_PORT, 1000) if self.connection: self.cReader.addConnection(self.connection) taskMgr.add(self.updateRoutine, 'updateRoutine-Connection', -39) taskMgr.doMethodLater(5, self.checkConnection, 'checkConnection') return True except: pass return False def closeConnection(self): """Close the current connection with the remote host. If an existing connection is found, remove both the Main task, which is responsible for the heartbeat, and the Connection task, which is responsible for reading packets from the socket, then properly close the existing connection. """ if self.connection != None: taskMgr.remove('updateRoutine-Main') taskMgr.remove('updateRoutine-Connection') taskMgr.remove('checkConnection') self.cManager.closeConnection(self.connection) self.connection = None def sendRequest(self, requestCode, args = {}): """Prepare a request packet to be sent. If the following request code exists, create an instance of this specific request using any extra arguments, then properly send it to the remote host. """ if self.connection != None: request = self.rqTable.get(requestCode) if request != None: request.set(self.cWriter, self.connection) #print('requestCode:'+str(requestCode)) #print('args:'+str(args)) request.send(args) def handleResponse(self, responseCode, data): """Prepare a response packet to be processed. If the following response code exists, create an instance of this specific response using its data to be executed. """ response = self.rsTable.get(responseCode) if response != None: response.set(self.main) response.execute(data) def checkConnection(self, task): if not self.cReader.isConnectionOk(self.connection): self.closeConnection() #self.showDisconnected(0) return task.done return task.again def updateRoutine(self, task): """A once-per-frame task used to read packets from the socket.""" while self.cReader.dataAvailable(): # Create a datagram to store all necessary data. datagram = NetDatagram() # Retrieve the contents of the datagram. if self.cReader.getData(datagram): # Prepare the datagram to be iterated. data = PyDatagramIterator(datagram) # Retrieve a "short" that contains the response code. responseCode = data.getUint16() # Pass into another method to execute the response. if responseCode != Constants.MSG_NONE: self.handleResponse(responseCode, data) return task.cont
class ConnectionManager: def __init__(self): self.cManager = QueuedConnectionManager() self.cListener = QueuedConnectionListener(self.cManager, 0) self.cReader = QueuedConnectionReader(self.cManager, 0) self.cWriter = ConnectionWriter(self.cManager, 0) self.rqTable = ServerRequestTable() self.rsTable = ServerResponseTable() self.connection = None def startConnection(self): """Create a connection with the remote host. If a connection can be created, create a task with a sort value of -39 to read packets from the socket. """ try: if self.connection == None: self.connection = self.cManager.openTCPClientConnection( Constants.SERVER_IP, Constants.SERVER_PORT, 1000) if self.connection: self.cReader.addConnection(self.connection) taskMgr.add(self.updateRoutine, 'updateRoutine-Connection', -39) taskMgr.doMethodLater(5, self.checkConnection, 'checkConnection') return True except: pass return False def closeConnection(self): """Close the current connection with the remote host. If an existing connection is found, remove both the Main2 task, which is responsible for the heartbeat, and the Connection task, which is responsible for reading packets from the socket, then properly close the existing connection. """ if self.connection != None: taskMgr.remove('updateRoutine-Main2') taskMgr.remove('updateRoutine-Connection') taskMgr.remove('checkConnection') self.cManager.closeConnection(self.connection) self.connection = None def sendRequest(self, requestCode, args={}): """Prepare a request packet to be sent. If the following request code exists, create an instance of this specific request using any extra arguments, then properly send it to the remote host. """ if self.connection != None: request = self.rqTable.get(requestCode) if request != None: request.set(self.cWriter, self.connection) request.send(args) def handleResponse(self, responseCode, data): """Prepare a response packet to be processed. If the following response code exists, create an instance of this specific response using its data to be executed. """ response = self.rsTable.get(responseCode) if response != None: #response.set(main) response.execute(data) def checkConnection(self, task): if not self.cReader.isConnectionOk(self.connection): self.closeConnection() self.showDisconnected(0) return task.done return task.again def updateRoutine(self, task): """A once-per-frame task used to read packets from the socket.""" while self.cReader.dataAvailable(): # Create a datagram to store all necessary data. datagram = NetDatagram() # Retrieve the contents of the datagram. if self.cReader.getData(datagram): # Prepare the datagram to be iterated. data = PyDatagramIterator(datagram) # Retrieve a "short" that contains the response code. responseCode = data.getUint16() # Pass into another method to execute the response. if responseCode != Constants.MSG_NONE: self.handleResponse(responseCode, data) return task.cont