def run(self): self.inputs.append(self.client1) self.inputs.append(self.client2) self.message_queues[self.client1] = queue.Queue() self.message_queues[self.client2] = queue.Queue() ## create server pool self.server = CommServer(self, self.client1, self.client2) ## create game self.game = GameLogic(self.server) self.set_ind(self.server) self.server.set_ind(self.game) while self.inputs: try: readable, writable, exceptional = select.select(self.inputs, self.outputs, self.inputs, 1) except select.error: pass for s in readable: data = s.recv(1024) if data: print("received data '{}' from {}".format(data, s.getpeername())) self.ind.received_ind(data, s) else: print("closing connection {}".format(s.getpeername())) self.inputs.remove(s) if s in self.outputs: self.outputs.remove(s) s.close() del self.message_queues[s] self.ind.close_connection_ind(s) for s in writable: try: next_msg = self.message_queues[s].get_nowait() except queue.Empty: print("Error, queue empty") pass else: print("sending message '{}' to {}".format(next_msg, s.getpeername())) self.outputs.remove(s) s.send(next_msg)
class ClientThread(ITransReq, threading.Thread): #A server thread def __init__(self, client1, client2): self.client1 = client1[0] self.client2 = client2[0] self.client1_info = client1[1] self.client2_info = client2[1] self.ind = None self.inputs = [] self.outputs = [] self.message_queues = {} super().__init__() def run(self): self.inputs.append(self.client1) self.inputs.append(self.client2) self.message_queues[self.client1] = queue.Queue() self.message_queues[self.client2] = queue.Queue() ## create server pool self.server = CommServer(self, self.client1, self.client2) ## create game self.game = GameLogic(self.server) self.set_ind(self.server) self.server.set_ind(self.game) while self.inputs: try: readable, writable, exceptional = select.select(self.inputs, self.outputs, self.inputs, 1) except select.error: pass for s in readable: data = s.recv(1024) if data: print("received data '{}' from {}".format(data, s.getpeername())) self.ind.received_ind(data, s) else: print("closing connection {}".format(s.getpeername())) self.inputs.remove(s) if s in self.outputs: self.outputs.remove(s) s.close() del self.message_queues[s] self.ind.close_connection_ind(s) for s in writable: try: next_msg = self.message_queues[s].get_nowait() except queue.Empty: print("Error, queue empty") pass else: print("sending message '{}' to {}".format(next_msg, s.getpeername())) self.outputs.remove(s) s.send(next_msg) #Thread exits #print("Thread exit") def req_open_connection(self, host): pass def set_ind(self, commserver): self.ind = commserver def req_send(self, data, player): self.message_queues[player].put(data) self.outputs.append(player) def req_close_connection(self): self.client1.close() self.client2.close() self.inputs = []