#! /usr/bin/python

import socket
import thread
import threading

MYNETNUM = 0

HOST = ''
PORT = 37300 + MYNETNUM

# thread to handle a client connection
def handleClient(clnt, playerNum, playerEvent):
    clntHand = clnt.makefile()
    msg = 'GAME pong\n\r'
    clntHand.write(msg)                       # TCP write   GAME pong
    clntHand.flush()
    print 'TP', playerNum, '<--', msg
    data = clntHand.readline()                # TCP read    NAME xxxxx
    print 'TP', playerNum, '-->', data
    clntUDPPort = PORT+playerNum
    pUDPSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    pUDPSock.bind((HOST,clntUDPPort))
    msg = 'UDP ' + str(clntUDPPort) + '\n\r'
    clntHand.write(msg)                       # TCP write  UDP nnnn
    clntHand.flush()
    uMsg,uAddr = pUDPSock.recvfrom(1024)      # UDP read   OK UDP
    print 'UP', playerNum, '-->', uMsg
    msg = 'OK\n\r' ;
    clntHand.write(msg)                       # TCP write  OK
    clntHand.flush()
    if (playerNum == 1):
      msg = 'WAIT\n\r' ;
      clntHand.write(msg)                     # TCP write  WAIT
      clntHand.flush()
      print 'TP', playerNum, '<--', msg
      playerEvent.wait()         # wait for player 2
    else: 
      playerEvent.set()          # wake up player 1
    msg = 'START\n\r' ;
    clntHand.write(msg)                       # TCP write  START
    clntHand.flush()
    print 'TP', playerNum, '<--', msg
    while 1:
        uMsg,uAddr = pUDPSock.recvfrom(1024)  # UDP read   An=xxxx
        print 'UP', playerNum, '-->', uMsg
    clntHand.close()
    clnt.close()


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   # not a great idea
s.bind((HOST, PORT))
s.listen(4)
numClients = 0
readyToPlay = threading.Event()
readyToPlay.clear()
while 1:
    conn, addr = s.accept()
    print 'Connection from', addr
    print 'Client ', numClients
    if (numClients == 2):
        conn.close()
    else:
        numClients = numClients + 1
        thread.start_new_thread(handleClient,(conn,numClients,readyToPlay))
    
