class ClientManager(QThread): clientDisconnected = pyqtSignal(str) def __init__(self, parent=None): QThread.__init__(self, parent) self.address = None #clients --> {socket object: (address, identifier), } self.clients = {} self.dispatcher = Dispatcher(self) def setDispatcher(self, dispatcher): self.dispatcher = dispatcher def hasConnected(self, address): for client in self.clients: if self.clients[client][0] == address: return True def connectToServer(self, address): """address格式为(url, port)""" if self.hasConnected(address): Log.w('已经连接到服务器') return clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) clientSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: clientSocket.connect(address) client = Client(clientSocket, -1) self.clients[client] = (address, -1) Log.i('成功连接到服务器') return True except Exception as e: Log.e(getExceptionInfo(e)) def disConnectToServer(self, address): for client in self.clients: if self.clients[client][0] == address: client.close() del self.clients[client] Log.i('删除客户端: ' + str(self.clients[client][0])) def run(self): while True: brokenClients = [] readers, writers = self.setFs() rList, wList, eList = select.select(readers, writers, [], 0.2) for client in self.clients: if client.getFd() in rList: status = client.read() if status == Client.ReadError: Log.e('Socket read error') brokenClients.append(client) elif status == Client.NoMessage: Log.i('No Message') brokenClients.append(client) elif status == Client.NewMessage: Log.i('New Message') else: Log.e('Unknown socket status') if client.hasRequests(): self.treatMessage(client) if client.getFd() in wList: status = client.reply() if status == Client.WriteError: Log.e('Socket write error with socket %s' % (self.clients[client][0], )) if client not in brokenClients: brokenClients.append(client) elif status == Client.WriteSuccess: Log.i('Send Message success') for client in brokenClients: Log.i('删除客户端: ' + str(self.clients[client][0])) client.close() del self.clients[client] self.clientDisconnected.emit(str(client.clientId)) Log.i(self.clients) def setFs(self): readFs = [] writeFs = [] for client in self.clients: readFs.append(client.getFd()) if client.hasReplies(): writeFs.append(client.getFd()) return readFs, writeFs def treatMessage(self, client): client.addReply(self.dispatcher.dispatchRequest(client))
class Server(QThread): clientIn = pyqtSignal(socket.socket) clientDisconnected = pyqtSignal(str) def __init__(self, port, parent=None): QThread.__init__(self, parent) self.port = port self.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.serverSocket.bind(('', self.port)) self.serverSocket.listen(5) self.serverSocket.setblocking(False) self.dispatcher = Dispatcher(self) #clients --> {clientId: Socket object} self.clients = {} EventManager.bind('Message.broadcast', self.broadcast) def broadcast(self, message, exception=()): for clientId in self.clients: if clientId not in exception: EventManager.trigger(Event('Socket.addReply.' + clientId, message)) def setDispatcher(self, dispatcher): self.dispatcher = dispatcher def stop(self): self.serverSocket.shutdown(socket.SHUT_RDWR) self.serverSocket.close() def getFd(self): return self.serverSocket def run(self): while True: brokenClients = [] readers, writers = self.setFs() rList, wList, eList = select.select(readers, writers, [], 0.2) if self.getFd() in rList: self.acceptNewClient() for identifier in self.clients: if self.clients[identifier].getFd() in rList: status = self.clients[identifier].read() if status == Socket.ReadError: Log.e('Socket read error') brokenClients.append(identifier) elif status == Socket.NoMessage: Log.i('No Message') brokenClients.append(identifier) elif status == Socket.NoMessage: Log.i('New Message') if self.clients[identifier].hasRequests(): self.treatMessage(self.clients[identifier]) if self.clients[identifier].getFd() in wList: status = self.clients[identifier].reply() if status == Socket.WriteError: Log.e('Socket write error with socket %s' % (identifier, )) if identifier not in brokenClients: brokenClients.append(identifier) elif status == Socket.WriteSuccess: Log.i('Send Message success') for identifier in brokenClients: Log.i('删除客户端: ' + str(identifier)) self.clients[identifier].close() del self.clients[identifier] self.clientDisconnected.emit(identifier) Log.i(self.clients) def acceptNewClient(self): Log.i('connect in') s, addr = self.serverSocket.accept() if not s: Log.e('Cannot accept connection') return identifier = uuid.uuid4().hex self.clients[identifier] = Socket(s, identifier) self.clients[identifier].addReply(Message(cmd=Message.CMD_CLIENT_VALIDATED, clientId=identifier)) Log.i(self.clients) def setFs(self): readFs = [] writeFs = [] readFs.append(self.getFd()) for identifier in self.clients: readFs.append(self.clients[identifier].getFd()) if self.clients[identifier].hasReplies(): writeFs.append(self.clients[identifier].getFd()) return readFs, writeFs def treatMessage(self, client): request = client.getRequest() client.addReply(self.dispatcher.dispatchRequest(request))
class Server(QThread): clientIn = pyqtSignal(socket.socket) clientDisconnected = pyqtSignal(str) def __init__(self, port, parent=None): QThread.__init__(self, parent) self.port = port self.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.serverSocket.bind(('', self.port)) self.serverSocket.listen(5) self.serverSocket.setblocking(False) self.dispatcher = Dispatcher(self) #clients --> {clientId: Socket object} self.clients = {} EventManager.bind('Message.broadcast', self.broadcast) def broadcast(self, message, exception=()): for clientId in self.clients: if clientId not in exception: EventManager.trigger( Event('Socket.addReply.' + clientId, message)) def setDispatcher(self, dispatcher): self.dispatcher = dispatcher def stop(self): self.serverSocket.shutdown(socket.SHUT_RDWR) self.serverSocket.close() def getFd(self): return self.serverSocket def run(self): while True: brokenClients = [] readers, writers = self.setFs() rList, wList, eList = select.select(readers, writers, [], 0.2) if self.getFd() in rList: self.acceptNewClient() for identifier in self.clients: if self.clients[identifier].getFd() in rList: status = self.clients[identifier].read() if status == Socket.ReadError: Log.e('Socket read error') brokenClients.append(identifier) elif status == Socket.NoMessage: Log.i('No Message') brokenClients.append(identifier) elif status == Socket.NoMessage: Log.i('New Message') if self.clients[identifier].hasRequests(): self.treatMessage(self.clients[identifier]) if self.clients[identifier].getFd() in wList: status = self.clients[identifier].reply() if status == Socket.WriteError: Log.e('Socket write error with socket %s' % (identifier, )) if identifier not in brokenClients: brokenClients.append(identifier) elif status == Socket.WriteSuccess: Log.i('Send Message success') for identifier in brokenClients: Log.i('删除客户端: ' + str(identifier)) self.clients[identifier].close() del self.clients[identifier] self.clientDisconnected.emit(identifier) Log.i(self.clients) def acceptNewClient(self): Log.i('connect in') s, addr = self.serverSocket.accept() if not s: Log.e('Cannot accept connection') return identifier = uuid.uuid4().hex self.clients[identifier] = Socket(s, identifier) self.clients[identifier].addReply( Message(cmd=Message.CMD_CLIENT_VALIDATED, clientId=identifier)) Log.i(self.clients) def setFs(self): readFs = [] writeFs = [] readFs.append(self.getFd()) for identifier in self.clients: readFs.append(self.clients[identifier].getFd()) if self.clients[identifier].hasReplies(): writeFs.append(self.clients[identifier].getFd()) return readFs, writeFs def treatMessage(self, client): request = client.getRequest() client.addReply(self.dispatcher.dispatchRequest(request))