X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=qchess%2Fsrc%2Fnetwork.py;h=b68503797eac486253d9440ec38d5116ae070471;hb=538a32cb30f21a1a48653d7b639ab0c82db44d83;hp=a1ab013f50a3dce6f8c4b46ed6ad5aeac9a2acc3;hpb=f7cca7e99d39a6b04b605e988d182a9b8a9e4be3;p=progcomp2013.git diff --git a/qchess/src/network.py b/qchess/src/network.py index a1ab013..b685037 100644 --- a/qchess/src/network.py +++ b/qchess/src/network.py @@ -4,36 +4,105 @@ import select network_timeout_start = -1.0 # Timeout in seconds to wait for the start of a message network_timeout_delay = 1.0 # Maximum time between two characters being received -class Network(Player): - def __init__(self, colour, address = (None,4562), baseplayer = None): +class NetworkPlayer(Player): + def __init__(self, colour, network, player): + Player.__init__(self, "@network:"+str(network.address), colour) + self.player = player + self.network = network - if baseplayer != None: - name = baseplayer.name + " --> @network" + def __str__(self): + return "NetworkPlayer<"+str(self.colour)+","+str(self.player)+">" + + def select(self): + #debug(str(self) + " select called") + if self.player != None: + s = self.player.select() + self.send_message(str(s[0]) + " " + str(s[1])) + else: + s = map(int, self.get_response().split(" ")) + for p in game.players: + if p != self and isinstance(p, NetworkPlayer) and p.player == None: + p.network.send_message(str(s[0]) + " " + str(s[1])) + if s == [-1,-1]: + game.final_result = "network terminate" + game.stop() + return s + + def send_message(self, message): + #debug(str(self) + " send_message(\""+str(message)+"\") called") + self.network.send_message(message) + + def get_response(self): + #debug(str(self) + " get_response() called") + s = self.network.get_response() + #debug(str(self) + " get_response() returns \""+str(s)+"\"") + return s + + + def get_move(self): + #debug(str(self) + " get_move called") + if self.player != None: + s = self.player.get_move() + self.send_message(str(s[0]) + " " + str(s[1])) else: - name = "<-- @network" + s = map(int, self.get_response().split(" ")) + for p in game.players: + if p != self and isinstance(p, NetworkPlayer) and p.player == None: + p.network.send_message(str(s[0]) + " " + str(s[1])) + + if s == [-1,-1]: + game.final_result = "network terminate" + game.stop() + return s + + def update(self, result): + #debug(str(self) + " update(\""+str(result)+"\") called") + if self.network.server == True: + if self.player == None: + self.send_message(result) + elif self.player != None: + result = self.get_response() + if result == "-1 -1": + game.final_result = "network terminate" + game.stop() + return "-1 -1" + self.board.update(result, deselect=False) - - Player.__init__(self, name, colour) - debug("Colour is " + str(self.colour)) + if self.player != None: + result = self.player.update(result) + + return result + + + + def base_player(self): + if self.player == None: + return self + else: + return self.player.base_player() + + def quit(self, result): + try: + self.send_message("-1 -1") + except: + pass + +class Network(): + def __init__(self, address = (None,4562)): self.socket = socket.socket() self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self.baseplayer = baseplayer #self.socket.setblocking(0) - self.address = address self.server = (address[0] == None) - - if self.colour == "black": - self.address = (self.address[0], self.address[1] + 1) - - debug(str(self) + ":"+str(self.address)) - self.board = None - + + self.connected = False def connect(self): + #debug(str(self) + "Tries to connect") + self.connected = True if self.address[0] == None: self.host = "0.0.0.0" #socket.gethostname() # Breaks things??? self.socket.bind((self.host, self.address[1])) @@ -52,6 +121,7 @@ class Network(Player): return else: + time.sleep(0.3) self.socket.connect(self.address) self.src = self.socket self.src.send("ok\n") @@ -65,37 +135,12 @@ class Network(Player): return - def select(self): - if self.baseplayer != None: - s = self.baseplayer.select() - self.send_message(str(s[0]) + " " + str(s[1])) - return s - return map(int,self.get_response().split(" ")) - - def get_move(self): - if self.baseplayer != None: - s = self.baseplayer.get_move() - self.send_message(str(s[0]) + " " + str(s[1])) - return s - return map(int,self.get_response().split(" ")) - - def update(self, result): - if self.baseplayer != None: - result = self.baseplayer.update(result) - self.send_message(result) - return result - if self.server: - self.send_message(result) - else: - s = self.get_response() - if self.board != None: - self.board.update(s) - + def __str__(self): - return "Network<"+str(self.colour)+","+str(self.baseplayer)+">:"+str(self.address) + return "@network:"+str(self.address) def get_response(self): - debug(str(self) + " get_response called...") + # Timeout the start of the message (first character) if network_timeout_start > 0.0: ready = select.select([self.src], [], [], network_timeout_start)[0] @@ -118,7 +163,7 @@ class Network(Player): else: raise Exception("UNRESPONSIVE") - debug(str(self) + " get_response returns " + s.strip(" \r\n")) + return s.strip(" \r\n") def send_message(self,s): @@ -132,25 +177,8 @@ class Network(Player): else: raise Exception("UNRESPONSIVE") - debug(str(self) + " send_message sent " + s) - - def check_quit(self, s): - s = s.split(" ") - if s[0] == "QUIT": - with game.lock: - game.final_result = " ".join(s[1:]) + " " + str(opponent(self.colour)) - game.stop() - return True - - def quit(self, result): - if self.baseplayer != None: - self.send_message("QUIT") - - with game.lock: - game.final_result = result - game.stop() - - - - + + def close(self): + self.src.shutdown() + self.src.close()