I am writing a networked number guessing game and I could do with a little help with it. Apart from handling multiple clients, my server needs to accept a connection from a Admin client. The Admin client displays a list of the ip addresses and port numbers of the player clients connected to the server. I understand that I need to implement threading in order to achieve this.
Here is my code so far. I am unsure of how many threads are needed and how to pass the information of connected player clients into the thread.
#Server
import threading
import socket
import math
import random
import ssl
def within(guess,goal,n):
absValue = abs(guess - goal)
if absValue <= n:
return True
else:
return False
#def HandleAdmin(adminSocket):
#(conn,addr) = adminSocket.accept()
#ts = ssl.wrap_socket(conn, certfile="5cc515_server.crt",
#keyfile="5cc515_server.key",
#server_side=True,
#cert_reqs=ssl.CERT_REQUIRED,
#ca_certs="5cc515-root-ca.cer")
#if ts.recv(80).decode() == 'Hello\r\n':
#ts.send('Admin-Greetings\r\n'.encode())
#if ts.recv(80).decode() == 'Who\r\n':
#ts.send((c,a).encode())
#ts.close()
#return
def HandleClient(c,a):
scoreCount = 0
guess = 0
if(c.recv(80).decode()) == 'Hello\r\n':
c.send('Greetings\r\n'.encode())
goal = random.randrange(1,21)
while guess!= goal:
guess =c.recv(80).decode()
guess = int(guess[7:len(guess)-2])
if guess == goal:
c.send('Correct\r\n'.encode())
elif within(guess, goal, 2) == True:
c.send('Close\r\n'.encode())
else:
c.send('Far\r\n'.encode())
c.close()
return
clientSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientSocket.bind(("127.0.0.1",4000))
clientSocket.listen(5)
adminSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
adminSocket.bind(("127.0.0.1",4001))
adminSocket.listen(5)
while True:
(c,a) = clientSocket.accept()
#handleAdminThread = threading.Thread(target = AcceptAdminConnection,
# args = adminSocket)
clientThread = threading.Thread(target = HandleClient, args = (c,a))
clientThread.start()