Skip to content

Instantly share code, notes, and snippets.

@vshotarov
Last active September 15, 2017 10:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vshotarov/bc730399b56b238e55e3e0515e768dfc to your computer and use it in GitHub Desktop.
Save vshotarov/bc730399b56b238e55e3e0515e768dfc to your computer and use it in GitHub Desktop.
Simple socket chat server
import socket
import threading
class ThreadedServer(object):
def __init__(self, host, port):
self.host = host
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.host, self.port))
self.clients = {}
self.sentTo = {}
def listen(self):
self.sock.listen(5)
while True:
client, address = self.sock.accept()
if client:
self.clients[self.prettifyAddress(address)] = client
client.settimeout(60)
threading.Thread(target=self.listenToClient, args=(client, address)).start()
def listenToClient(self, client, address):
size = 1024
while True:
try:
data = client.recv(size)
if data:
# Set the response to echo back the recieved data
if data.replace("\n", "") == "ls":
response = str(self.clients.keys()) + "\n"
elif data[:2] == "/w":
fromAddress = self.prettifyAddress(address)
toAddress = data.split("/w")[1].lstrip().split(" ")[0]
message = "[" + fromAddress + "]: " + data.split(toAddress)[1].lstrip()
response = self.sendMessage(fromAddress=fromAddress, toAddress=toAddress, message=message)
elif data[:2] == "/r":
fromAddress = self.prettifyAddress(address)
if fromAddress in self.sentTo.keys():
toAddress = self.sentTo[fromAddress]
message = "[" + fromAddress + "]:" + data[2:].lstrip()
response = self.sendMessage(fromAddress=fromAddress, toAddress=toAddress, message=message)
else:
response = "No one to send to\n"
elif data[:2] == "me":
response = self.prettifyAddress(address) + "\n"
else:
response = "Message received " + data + "\n"
client.sendall(response)
else:
raise error('Client disconnected')
except:
del self.clients[":".join([str(address[0]), str(address[1])])]
client.close()
return False
def sendMessage(self,
fromAddress=None,
toAddress=None,
message=None):
if fromAddress in self.clients.keys():
if toAddress in self.clients.keys():
self.clients[toAddress].sendall(message)
self.sentTo[toAddress] = fromAddress
return "Me: " + message
else:
return "Client not found\n"
else:
return "Wrong from address\n"
def prettifyAddress(self,
address=None):
return ":".join([str(address[0]), str(address[1])])
if __name__ == "__main__":
port_num = 8000
ThreadedServer('', port_num).listen()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment