def process_communication(self): ## self.handle_messages() ## self.send_messages() fd_in = [self.socket] fd_in.extend(self.clients) #debug("Selecting: " + str(map(lambda s: s.fileno(), fd_in))) fd_out = self.clients2send fd_err = fd_in + fd_out try: ready_in, ready_out, ready_err = select.select( fd_in, fd_out, fd_err, 0.0) except: #this weird kludge works for python_mathematical_go, dunno why... try: ready_in, ready_out, ready_err = select.select( fd_in, fd_out, fd_err, 0.0) except: import pdb pdb.set_trace() if len(ready_err) > 0: debug("Clients are borken, " + str(ready_err)) for problem in ready_err: debug("Client[" + str(problem.fileno()) + "] borken, removing...") if problem in fd_in: self.remove_client(problem) if problem in fd_out: self.clients2send.remove(problem) self.remove_client(self.client) #debug("Ready: " + string.replace(str(map(lambda s: s.fileno(), ready_in+ready_out+ready_err)),"\n", "\\n")) if ready_in and ready_in[0] == self.socket: ready_in = ready_in[1:] new_client = self.client_factory(self, self.socket.accept()) print("Connected:", new_client.id) self.clients.append(new_client) debug("New connection: fileno(): %s, addr: %s" % (new_client.fileno(), new_client.addr)) #print "getpeername():", new_client.fd.getpeername() #print "getsockname():", new_client.fd.getsockname() for client in ready_in: self.client = client try: res = client.recv() except: fp = StringIO() traceback.print_exc(None, fp) debug("Client[" + str(client.fileno()) + "] caused socket/decoding exception, removing...: \n" + fp.getvalue()) self.remove_client(client) continue #CHEAT!: res is list of messages, in case we want to use it here also... for client in ready_out: self.client = client try: client.fd.send(client.send_buffer.pop(0)) except socket.error: self.clients2send.remove(client) self.remove_client(client) debug("Client[" + str(client.fileno()) + "] borken, removing...") return if not client.send_buffer: self.clients2send.remove(client)
def log(self, type, data): """various debug things""" s = "\n%s:\n%s" % (type, data) debug(s)
def process_communication(self): ## self.handle_messages() ## self.send_messages() fd_in = [self.socket] fd_in.extend(self.clients) #debug("Selecting: " + str(map(lambda s: s.fileno(), fd_in))) fd_out = self.clients2send fd_err = fd_in + fd_out try: ready_in, ready_out, ready_err = select.select(fd_in, fd_out, fd_err, 0.0) except: #this weird kludge works for python_mathematical_go, dunno why... try: ready_in, ready_out, ready_err = select.select(fd_in, fd_out, fd_err, 0.0) except: import pdb; pdb.set_trace() if len(ready_err) > 0: debug("Clients are borken, " + str(ready_err)) for problem in ready_err: debug("Client[" + str(problem.fileno()) + "] borken, removing...") if problem in fd_in: self.remove_client(problem) if problem in fd_out: self.clients2send.remove(problem) self.remove_client(client) #debug("Ready: " + string.replace(str(map(lambda s: s.fileno(), ready_in+ready_out+ready_err)),"\n", "\\n")) if ready_in and ready_in[0]==self.socket: ready_in = ready_in[1:] new_client = self.client_factory(self, self.socket.accept()) print "Connected:", new_client.id self.clients.append(new_client) debug("New connection: fileno(): %s, addr: %s" % (new_client.fileno(), new_client.addr)) #print "getpeername():", new_client.fd.getpeername() #print "getsockname():", new_client.fd.getsockname() for client in ready_in: try: res = client.recv() except: fp = StringIO() traceback.print_exc(None,fp) debug("Client[" + str(client.fileno()) + "] caused socket/decoding exception, removing...: \n"+ fp.getvalue()) self.remove_client(client) continue #CHEAT!: res is list of messages, in case we want to use it here also... for client in ready_out: try: client.fd.send(client.send_buffer.pop(0)) except socket.error: self.clients2send.remove(client) self.remove_client(client) debug("Client[" + str(client.fileno()) + "] borken, removing...") return if not client.send_buffer: self.clients2send.remove(client)