4 network_timeout_start = -1.0 # Timeout in seconds to wait for the start of a message
5 network_timeout_delay = 1.0 # Maximum time between two characters being received
7 class NetworkPlayer(Player):
8 def __init__(self, colour, network, player):
9 Player.__init__(self, "@network:"+str(network.address), colour)
11 self.network = network
14 return "NetworkPlayer<"+str(self.colour)+","+str(self.player)+">"
17 #debug(str(self) + " select called")
18 if self.player != None:
19 s = self.player.select()
20 self.send_message(str(s[0]) + " " + str(s[1]))
22 s = map(int, self.get_response().split(" "))
23 for p in game.players:
24 if p != self and isinstance(p, NetworkPlayer) and p.player == None:
25 p.network.send_message(str(s[0]) + " " + str(s[1]))
27 game.final_result = "network terminate"
31 def send_message(self, message):
32 #debug(str(self) + " send_message(\""+str(message)+"\") called")
33 self.network.send_message(message)
35 def get_response(self):
36 #debug(str(self) + " get_response() called")
37 s = self.network.get_response()
38 #debug(str(self) + " get_response() returns \""+str(s)+"\"")
43 #debug(str(self) + " get_move called")
44 if self.player != None:
45 s = self.player.get_move()
46 self.send_message(str(s[0]) + " " + str(s[1]))
48 s = map(int, self.get_response().split(" "))
49 for p in game.players:
50 if p != self and isinstance(p, NetworkPlayer) and p.player == None:
51 p.network.send_message(str(s[0]) + " " + str(s[1]))
54 game.final_result = "network terminate"
58 def update(self, result):
59 #debug(str(self) + " update(\""+str(result)+"\") called")
60 if self.network.server == True:
61 if self.player == None:
62 self.send_message(result)
63 elif self.player != None:
64 result = self.get_response()
66 game.final_result = "network terminate"
69 self.board.update(result, deselect=False)
73 if self.player != None:
74 result = self.player.update(result)
80 def base_player(self):
81 if self.player == None:
84 return self.player.base_player()
86 def quit(self, result):
88 self.send_message("-1 -1")
93 def __init__(self, address = (None,4562)):
94 self.socket = socket.socket()
95 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
96 #self.socket.setblocking(0)
97 self.address = address
98 self.server = (address[0] == None)
101 self.connected = False
104 #debug(str(self) + "Tries to connect")
105 self.connected = True
106 if self.address[0] == None:
107 self.host = "0.0.0.0" #socket.gethostname() # Breaks things???
108 self.socket.bind((self.host, self.address[1]))
109 self.socket.listen(5)
111 self.src, self.actual_address = self.socket.accept()
113 self.src.send("ok\n")
114 s = self.get_response()
120 self.__init__(colour, (self.address[0], int(s)), baseplayer)
125 self.socket.connect(self.address)
126 self.src = self.socket
127 self.src.send("ok\n")
128 s = self.get_response()
134 self.__init__(colour, (self.address[0], int(s)), baseplayer)
140 return "@network:"+str(self.address)
142 def get_response(self):
144 # Timeout the start of the message (first character)
145 if network_timeout_start > 0.0:
146 ready = select.select([self.src], [], [], network_timeout_start)[0]
149 if self.src in ready:
152 raise Exception("UNRESPONSIVE")
155 while s[len(s)-1] != '\n':
156 # Timeout on each character in the message
157 if network_timeout_delay > 0.0:
158 ready = select.select([self.src], [], [], network_timeout_delay)[0]
161 if self.src in ready:
162 s += self.src.recv(1)
164 raise Exception("UNRESPONSIVE")
167 return s.strip(" \r\n")
169 def send_message(self,s):
170 if network_timeout_start > 0.0:
171 ready = select.select([], [self.src], [], network_timeout_start)[1]
175 if self.src in ready:
176 self.src.send(s + "\n")
178 raise Exception("UNRESPONSIVE")