commit
0e05e4f0c5
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 45 KiB |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,5 @@
|
||||
SOCKET_HOST=127.0.0.1
|
||||
SOCKET_PORT=50005
|
||||
MAX_WAITING_TIME=600
|
||||
MAX_THNIKING_TIME=15
|
||||
MAX_TOTAL_TIME=1000
|
@ -0,0 +1,247 @@
|
||||
# coding:utf-8
|
||||
import socket
|
||||
import sys
|
||||
import json
|
||||
import uuid
|
||||
import time
|
||||
from threading import Thread, Lock
|
||||
|
||||
if(sys.version[:1] == "3"):
|
||||
import queue as Queue
|
||||
from _thread import *
|
||||
else:
|
||||
import Queue
|
||||
from thread import *
|
||||
|
||||
class Config:
|
||||
SOCKET_HOST = '127.0.0.1' # Symbolic name meaning all available interfaces
|
||||
SOCKET_PORT = 50005 # Arbitrary non-privileged port
|
||||
MAX_WAITING_TIME = 180
|
||||
MAX_THNIKING_TIME = 60
|
||||
MAX_TOTAL_TIME = 600
|
||||
|
||||
class Client:
|
||||
def __init__(self, conn, addr, name, side, time, total):
|
||||
self.conn = conn
|
||||
self.addr = addr
|
||||
self.name = name
|
||||
self.side = side
|
||||
self.time = time
|
||||
self.total = total
|
||||
|
||||
mutex = Lock()
|
||||
mutex_playing = Lock()
|
||||
|
||||
playing_ones = {}
|
||||
waiting_players = Queue.Queue()
|
||||
#init queues
|
||||
#for games in range(1, 10):
|
||||
# waiting_players[games] = Queue.Queue()
|
||||
|
||||
def load_config():
|
||||
with open('config.txt', 'r') as f:
|
||||
for line in f.readlines():
|
||||
line = line.strip()
|
||||
if line.find('SOCKET_HOST=') >= 0:
|
||||
Config.SOCKET_HOST = line[line.index('=') + 1 : ]
|
||||
elif line.find('SOCKET_PORT=') >= 0:
|
||||
Config.SOCKET_PORT = int(line[line.index('=') + 1 : ])
|
||||
elif line.find('MAX_WAITING_TIME=') >= 0:
|
||||
Config.MAX_WAITING_TIME = int(line[line.index('=') + 1 : ])
|
||||
elif line.find('MAX_THNIKING_TIME=') >= 0:
|
||||
Config.MAX_THNIKING_TIME = int(line[line.index('=') + 1 : ])
|
||||
elif line.find('MAX_TOTAL_TIME=') >= 0:
|
||||
Config.MAX_TOTAL_TIME = int(line[line.index('=') + 1 : ])
|
||||
else:
|
||||
pass
|
||||
|
||||
def get_counterpart_from(waiting_ones):
|
||||
counterpart = None
|
||||
mutex.acquire()
|
||||
if not waiting_ones.empty():
|
||||
counterpart = waiting_ones.get()
|
||||
mutex.release()
|
||||
return counterpart
|
||||
|
||||
def to_wait_in_queue(client, the_queue):
|
||||
mutex.acquire()
|
||||
the_queue.put(client)
|
||||
mutex.release()
|
||||
|
||||
def remove_one_from_queue(the_queue):
|
||||
mutex.acquire()
|
||||
if (the_queue.qsize() == 1):
|
||||
the_queue.get()
|
||||
mutex.release()
|
||||
|
||||
def send_msg_to(client, msg):
|
||||
packet = json.dumps(msg)
|
||||
if (sys.version[:1] == "3"):
|
||||
packet = packet.encode('utf-8')
|
||||
#print(client.addr[0] + ":" + str(client.addr[1]) + "\t" + str(msg))
|
||||
client.conn.send(packet)
|
||||
|
||||
def __start_match_between(client0, client1):
|
||||
match_uuid = str(uuid.uuid4())
|
||||
mutex_playing.acquire()
|
||||
playing_ones[match_uuid] = (client0, client1)
|
||||
mutex_playing.release()
|
||||
|
||||
client0.side = 0
|
||||
client0.time = Config.MAX_THNIKING_TIME
|
||||
client0.total = Config.MAX_TOTAL_TIME
|
||||
client1.side = 1
|
||||
client1.time = -1
|
||||
client1.total = Config.MAX_TOTAL_TIME
|
||||
|
||||
msg0 = {
|
||||
"status": 1,
|
||||
"counterpart_name": client1.name,
|
||||
"game_id": match_uuid,
|
||||
"side": client0.side,
|
||||
"think_time": Config.MAX_THNIKING_TIME,
|
||||
"total_time": Config.MAX_TOTAL_TIME,
|
||||
}
|
||||
send_msg_to(client0, msg0)
|
||||
msg1 = {
|
||||
"status": 1,
|
||||
"counterpart_name": client0.name,
|
||||
"game_id": match_uuid,
|
||||
"side": client1.side,
|
||||
"think_time": Config.MAX_THNIKING_TIME,
|
||||
"total_time": Config.MAX_TOTAL_TIME,
|
||||
}
|
||||
send_msg_to(client1, msg1)
|
||||
|
||||
def join_game_handler(msg, addr, conn):
|
||||
new_client = Client(conn, addr, msg['name'], -1, -1, -1)
|
||||
#game_type = msg["id"]
|
||||
#the_queue = waiting_players[game_type]
|
||||
counterpart = get_counterpart_from(waiting_players)
|
||||
if not counterpart: #wait
|
||||
to_wait_in_queue(new_client, waiting_players)
|
||||
return
|
||||
else:
|
||||
#counterpart=get_counterpart_from(waiting_players[game_type])
|
||||
__start_match_between(new_client, counterpart)
|
||||
|
||||
def quit_game_handler(msg):
|
||||
match_uuid = msg['game_id']
|
||||
if match_uuid is None:
|
||||
remove_one_from_queue(waiting_players)
|
||||
return
|
||||
pairs = None
|
||||
mutex_playing.acquire()
|
||||
if (match_uuid in playing_ones):
|
||||
pairs = playing_ones[match_uuid]
|
||||
del playing_ones[match_uuid]
|
||||
mutex_playing.release()
|
||||
|
||||
if pairs is not None:
|
||||
if(pairs[0].side == msg['side']):
|
||||
to_notify = pairs[1]
|
||||
else:
|
||||
to_notify = pairs[0]
|
||||
msg = {
|
||||
"status": 2, #exit
|
||||
"game_id": match_uuid,
|
||||
"side": msg['side'],
|
||||
"request": msg['request'],
|
||||
}
|
||||
send_msg_to(to_notify, msg)
|
||||
|
||||
def timer_thread():
|
||||
while True:
|
||||
time.sleep(1)
|
||||
mutex_playing.acquire()
|
||||
for game_id in list(playing_ones.keys()):
|
||||
(client0, client1) = playing_ones[game_id]
|
||||
#print("%d - %d" % (client0.time, client1.time))
|
||||
if (client0.time < 0):
|
||||
client = client1
|
||||
else:
|
||||
client = client0
|
||||
|
||||
if (client.time == 0 or client.total == 0):
|
||||
msg = {
|
||||
"status": 3, #timeout exit
|
||||
"game_id": game_id,
|
||||
"side": client.side,
|
||||
}
|
||||
send_msg_to(client0, msg)
|
||||
send_msg_to(client1, msg)
|
||||
del playing_ones[game_id]
|
||||
else:
|
||||
client.time -= 1
|
||||
client.total -= 1
|
||||
mutex_playing.release()
|
||||
|
||||
def transfer_message(msg):
|
||||
match_uuid = msg['game_id']
|
||||
pairs = playing_ones[match_uuid]
|
||||
if(pairs[0].side == msg['side']):
|
||||
to_notify = pairs[1]
|
||||
pairs[0].time = -1
|
||||
else:
|
||||
to_notify = pairs[0]
|
||||
pairs[1].time = -1
|
||||
to_notify.time = Config.MAX_THNIKING_TIME
|
||||
send_msg_to(to_notify, msg)
|
||||
|
||||
def client_thread(conn, addr):
|
||||
while True:
|
||||
data = conn.recv(1024)
|
||||
if not data:
|
||||
break
|
||||
print(data)
|
||||
data = json.loads(data)
|
||||
|
||||
if not 'type' in data:
|
||||
transfer_message(data['msg'])
|
||||
continue
|
||||
if data['type'] == 0:
|
||||
join_game_handler(data['msg'], addr, conn)
|
||||
continue
|
||||
elif data['type'] == 1:
|
||||
transfer_message(data['msg'])
|
||||
continue
|
||||
elif data['type'] == 2:
|
||||
quit_game_handler(data['msg'])
|
||||
break
|
||||
elif data['type'] == 3:
|
||||
break
|
||||
else:
|
||||
#delivering message between the two clients
|
||||
transfer_message(data['msg'])
|
||||
continue
|
||||
#came out of loop
|
||||
conn.close()
|
||||
|
||||
def main():
|
||||
load_config()
|
||||
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
print('Socket server created')
|
||||
#try:
|
||||
server.bind((Config.SOCKET_HOST, Config.SOCKET_PORT))
|
||||
#except (socket.error, msg):
|
||||
# print ('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
|
||||
# sys.exit()
|
||||
|
||||
print('Socket bind complete')
|
||||
server.listen(10)
|
||||
print('Socket now listening')
|
||||
|
||||
#now keep talking with the client
|
||||
start_new_thread(timer_thread, ())
|
||||
while True: #! 监听本体
|
||||
#wait to accept a connection - blocking call
|
||||
conn, addr = server.accept()
|
||||
print ('Connected with ' + addr[0] + ':' + str(addr[1]))
|
||||
|
||||
#start new thread takes 1st argument as a function name to be run, second is the tuple of arguments to the function.
|
||||
start_new_thread(client_thread, (conn, addr))
|
||||
server.close()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
Loading…
Reference in new issue