1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
import socket
import random
import _thread
class GameServer:
""" Server class for gaming LESS/MORE/WINNER """
server = True
max_connected = 50
lock = False
number = 0
def __init__(self, host=socket.gethostbyname(socket.gethostname()),
port=random.randint(1025, 10000)):
""" Init parameter of game server
:param host:
:param port:
"""
self.host = host
self.port = port
""" Declare list for management users """
self.socket_list = list()
self.gamers = list()
self.number = random.randint(1, 100)
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind((self.host, self.port))
self.server.listen(self.max_connected)
self.lock = _thread.allocate_lock()
def renew(self):
""" Renew number """
self.number = random.randint(1, 100)
print('New game started, number is %i' % self.number)
def id(self):
""" Generate new gamer ID"""
game_id = 0
while game_id not in self.gamers:
game_id = random.randint(1, 1000)
self.gamers.append(game_id)
return game_id
def broadcast(self, winner):
""" Diffused information at other gamer"""
for gamer in self.socket_list:
gamer.send(GameServer.write('WINNER:%i' % winner))
def whoes(self):
""" Return number of users """
return len(self.gamers)
@staticmethod
def write(message):
""" Convert message to encode """
return str(message).encode()
def handler(self, client, game_id):
""" Thread client to liberate accept """
while True:
try:
request = client.recv(1024).decode()
if request == 'END':
print('Gamer %i has left the game...' % game_id)
self.gamers.remove(game_id)
client.close()
break
request = request.split(':')
if request[1] == 'WHOES':
client.send(GameServer.write('NB:%i' % self.whoes()))
continue
else:
r_number = int(request[1])
print('Received %i from %i' % (game_id, r_number))
if r_number == self.number:
self.broadcast(game_id)
print('Winner ! gamer %i' % game_id)
self.renew()
else:
if r_number < self.number:
client.send('MORE:0'.encode())
elif r_number > self.number:
client.send('LESS:0'.encode())
except ConnectionError:
print('lost connection with gamer %i ...' % game_id)
client.close()
def run(self):
""" Run server """
print('Server start on %s:%i ...' % (self.host, self.port))
print('Secret number is %i ' % self.number)
while True:
(gamer, addr) = self.server.accept()
game_id = self.id()
print('accept connection to %s : %s' % (str(addr), game_id))
self.socket_list.append(gamer)
gamer.send(str(game_id).encode())
_thread.start_new_thread(self.handler, (gamer, game_id,))
#Server start
game = GameServer(host='127.0.0.1', port=58005)
game.run() |
Partager