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,4562), baseplayer = None):
10 if baseplayer != None:
11 name = baseplayer.name + " --> @network"
17 Player.__init__(self, name, colour)
18 debug("Colour is " + str(self.colour))
20 self.socket = socket.socket()
21 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
22 self.baseplayer = baseplayer
23 #self.socket.setblocking(0)
25 self.address = address
26 self.server = (address[0] == None)
28 if self.colour == "black":
29 self.address = (self.address[0], self.address[1] + 1)
31 debug(str(self) + ":"+str(self.address))
37 if self.address[0] == None:
38 self.host = "0.0.0.0" #socket.gethostname() # Breaks things???
39 self.socket.bind((self.host, self.address[1]))
42 self.src, self.actual_address = self.socket.accept()
45 s = self.get_response()
51 self.__init__(colour, (self.address[0], int(s)), baseplayer)
55 self.socket.connect(self.address)
56 self.src = self.socket
58 s = self.get_response()
64 self.__init__(colour, (self.address[0], int(s)), baseplayer)
69 if self.baseplayer != None:
70 s = self.baseplayer.select()
71 self.send_message(str(s[0]) + " " + str(s[1]))
73 return map(int,self.get_response().split(" "))
76 if self.baseplayer != None:
77 s = self.baseplayer.get_move()
78 self.send_message(str(s[0]) + " " + str(s[1]))
80 return map(int,self.get_response().split(" "))
82 def update(self, result):
83 if self.baseplayer != None:
84 result = self.baseplayer.update(result)
85 self.send_message(result)
88 self.send_message(result)
90 s = self.get_response()
91 if self.board != None:
95 return "Network<"+str(self.colour)+","+str(self.baseplayer)+">:"+str(self.address)
97 def get_response(self):
98 debug(str(self) + " get_response called...")
99 # Timeout the start of the message (first character)
100 if network_timeout_start > 0.0:
101 ready = select.select([self.src], [], [], network_timeout_start)[0]
104 if self.src in ready:
107 raise Exception("UNRESPONSIVE")
110 while s[len(s)-1] != '\n':
111 # Timeout on each character in the message
112 if network_timeout_delay > 0.0:
113 ready = select.select([self.src], [], [], network_timeout_delay)[0]
116 if self.src in ready:
117 s += self.src.recv(1)
119 raise Exception("UNRESPONSIVE")
121 debug(str(self) + " get_response returns " + s.strip(" \r\n"))
122 return s.strip(" \r\n")
124 def send_message(self,s):
125 if network_timeout_start > 0.0:
126 ready = select.select([], [self.src], [], network_timeout_start)[1]
130 if self.src in ready:
131 self.src.send(s + "\n")
133 raise Exception("UNRESPONSIVE")
135 debug(str(self) + " send_message sent " + s)
137 def check_quit(self, s):
141 game.final_result = " ".join(s[1:]) + " " + str(opponent(self.colour))
145 def quit(self, result):
146 if self.baseplayer != None:
147 self.send_message("QUIT")
150 game.final_result = result