示例#1
0
    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)
示例#2
0
 def log(self, type, data):
     """various debug things"""
     s = "\n%s:\n%s" % (type, data)
     debug(s)
示例#3
0
    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)
示例#4
0
 def log(self, type, data):
     """various debug things"""
     s = "\n%s:\n%s" % (type, data)
     debug(s)