Written in Python, this was created for the last assignment of Networking Concepts in Year 1. There are 2 other files player1.py and player2.py which interact with server.py. The player files contain the game board and main game loop. This works over a local network and allows players to play Tic Tac Toe on different computers.
Server.py
import socket, select
#function to broadcast chat messages to all connected clients
def broadcast_data (sock, message):
#do not send the message to master socket and the client who has sent the message
for socket in CONNECTION_LIST:
#for each socket in the connection list do this:
if socket != server_socket and socket != sock: #if the socket is not equal to the server socket and the socket that sent the message, do this:
try:
socket.send(message) #send the message to the other socket
except:
#broken socket connection may be, chat client pressed ctrl+c for example
socket.close() #close the connection and remove it from the list of connected sockets
CONNECTION_LIST.remove(socket)
if __name__== "__main__":
#list to keep track of socket descriptors
CONNECTION_LIST = []
RECV_BUFFER = 4096 #data buffer size
PORT = 5004 #port number
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #create a stream socket called server_socket
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('', PORT)) #bind port number to the address, left empty so it can be any address the server is on
server_socket.setblocking(0) #set the port to non-blocking so it can listen for other connections and talk to them instead of waiting for one client
server_socket.listen(10) #keep listening for connections, allow up to 10
#add server socket to list or readable connections
CONNECTION_LIST.append(server_socket)
print socket.gethostname() #prints the name of the host the server is on
print "Tic Tac Toe server started in port " + str(PORT)
while 1:
#get the list sockets which are ready to be read through select
read_sockets, write_sockets, error_sockets = select.select(CONNECTION_LIST,[],[])
for sock in read_sockets: #for every sock in read_sockets do this:
#new connection
if sock == server_socket:
#if the incoming connection has the same details, accept the client and add it's address to the connection list, printing that it has connected
sockfd, addr = server_socket.accept() #accept the connection
CONNECTION_LIST.append(sockfd) #push back connection details into the list
print "Client (%s, %s) connected" % addr
#some incoming message from a client
else:
try:
#get the incoming data, if there is something, send it to the other clients connected to the server
data = sock.recv(1024)
if data:
broadcast_data(sock, data)
except:
#if a client disconnects print a message saying the client has disconnected, close the associating socket and remove it from the connection list
broadcast_data(sock, "Client (%s, %s) is offline" % addr)
print "Client %s, %s) is offline" % addr
sock.close()
CONNECTION_LIST.remove(sock)
continue
server_socket.close()