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
8 def __init__(self, colour, address = None):
9 self.socket = socket.socket()
10 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
11 #self.socket.setblocking(0)
13 self.server = (address == None)
22 # print str(self) + " listens on port " + str(self.port)
25 self.host = "0.0.0.0" #socket.gethostname() # Breaks things???
26 self.socket.bind((self.host, self.port))
29 self.src, self.address = self.socket.accept()
31 if self.get_response() == "QUIT":
35 self.socket.connect((address, self.port))
36 self.src = self.socket
38 if self.get_response() == "QUIT":
40 self.address = (address, self.port)
42 def get_response(self):
43 # Timeout the start of the message (first character)
44 if network_timeout_start > 0.0:
45 ready = select.select([self.src], [], [], network_timeout_start)[0]
51 raise Exception("UNRESPONSIVE")
54 while s[len(s)-1] != '\n':
55 # Timeout on each character in the message
56 if network_timeout_delay > 0.0:
57 ready = select.select([self.src], [], [], network_timeout_delay)[0]
63 raise Exception("UNRESPONSIVE")
65 return s.strip(" \r\n")
67 def send_message(self,s):
68 if network_timeout_start > 0.0:
69 ready = select.select([], [self.src], [], network_timeout_start)[1]
74 self.src.send(s + "\n")
76 raise Exception("UNRESPONSIVE")
78 def check_quit(self, s):
82 game.final_result = " ".join(s[1:]) + " " + str(opponent(self.colour))
89 class NetworkSender(Player,Network):
90 def __init__(self, base_player, address = None):
91 self.base_player = base_player
92 Player.__init__(self, base_player.name, base_player.colour)
94 self.address = address
98 for i in range(nAttempts):
100 Network.__init__(self, self.colour, self.address)
101 debug(str(self) +" connected to " + str(self.address))
104 debug(str(self) +" attempt " + str(i) + ": " + str(e.message))
106 raise Exception("NETWORK - Can't connect to " + str(self.address))
110 [x,y] = self.base_player.select()
111 choice = self.board.grid[x][y]
112 s = str(x) + " " + str(y)
113 #debug(str(self) + " sends: " + str(s))
118 [x,y] = self.base_player.get_move()
119 s = str(x) + " " + str(y)
120 #debug(str(self) + " sends: " + str(s))
126 self.base_player.update(s)
127 if self.server == True:
128 #debug(str(self) + " sends: " + str(s))
133 [x,y] = map(int, s[0:2])
134 selected = self.board.grid[x][y]
135 if selected != None and selected.colour == self.colour and len(s) > 2 and not "->" in s:
138 if selected.types[i][0] != '?':
139 s += " " + str(selected.types[i])
142 #debug(str(self) +" sending: " + str(s))
146 def quit(self, final_result):
147 self.base_player.quit(final_result)
148 #self.src.send("QUIT " + str(final_result) + "\n")
157 s += ":"+str(self.address)
161 class NetworkReceiver(Player,Network):
162 def __init__(self, colour, address=None):
166 s += ":"+str(address)
167 Player.__init__(self, s, colour)
169 self.address = address
176 for i in range(nAttempts):
178 Network.__init__(self, self.colour, self.address)
179 debug(str(self) +" connected to " + str(self.address))
182 debug(str(self) +" attempt " + str(i) + ": " + str(e.message))
184 raise Exception("NETWORK - Can't connect to " + str(self.address))
190 s = self.get_response()
191 #debug(str(self) +".select reads: " + str(s))
192 [x,y] = map(int,s.split(" "))
193 if x == -1 and y == -1:
194 #print str(self) + ".select quits the game"
196 game.final_state = "network terminated " + self.colour
200 s = self.get_response()
201 #debug(str(self) +".get_move reads: " + str(s))
202 [x,y] = map(int,s.split(" "))
203 if x == -1 and y == -1:
204 #print str(self) + ".get_move quits the game"
206 game.final_state = "network terminated " + self.colour
210 def update(self, result):
211 if self.server == True:
213 s = self.get_response()
214 #debug(str(self) + ".update reads: " + str(s))
215 if not "->" in s.split(" "):
216 self.board.update(s, sanity=False)
220 def quit(self, final_result):
224 s = "NetworkReceiver:"
229 s += ":"+str(self.address)