Last active
September 15, 2017 10:42
-
-
Save vshotarov/bc730399b56b238e55e3e0515e768dfc to your computer and use it in GitHub Desktop.
Simple socket chat server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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