Created
October 19, 2015 10:55
-
-
Save posquit0/2ab784630a2f20595a22 to your computer and use it in GitHub Desktop.
Simple Chat Server with Python (Not needed Client Interface)
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
#!/usr/bin/env python | |
# encoding: utf-8 | |
from Queue import Queue | |
from SocketServer import BaseRequestHandler, ThreadingTCPServer | |
from datetime import datetime | |
import threading | |
ThreadingTCPServer.allow_reuse_address = True | |
HOST = "0.0.0.0" | |
PORT = 31337 | |
session_pool = dict() | |
message_queue = Queue() | |
class ChatTCPRequestHandler(BaseRequestHandler): | |
global session_pool | |
global message_queue | |
def welcome(self): | |
s = self.request | |
msg = "" | |
msg += "//-----------------------------------------|\r\n" | |
msg += "| Simple Chat Server |\r\n" | |
msg += "| |\r\n" | |
msg += "| Written by Posquit0.BJ |\r\n" | |
msg += "|-----------------------------------------//\r\n" | |
msg += "\r\n" | |
s.sendall(msg) | |
def set_nickname(self): | |
s = self.request | |
while True: | |
try: | |
msg = "[?] Enter your name (16): " | |
s.sendall(msg) | |
username = s.recv(32).strip() | |
if username: | |
msg = "[!] New User: %(username)s\r\n" % { | |
'username': username | |
} | |
message_queue.put(msg) | |
session_pool[username] = s | |
break | |
except: | |
continue | |
return username | |
def chat(self, username): | |
s = self.request | |
while True: | |
try: | |
msg = s.recv(2048).strip() | |
if not msg: | |
continue | |
formatted = "[%(time)s] <%(username)s> : %(content)s\r\n" % { | |
'time': datetime.now().strftime("%m/%d %H:%M:%S"), | |
'username': username, | |
'content': msg | |
} | |
message_queue.put(formatted) | |
except: | |
continue | |
def handle(self): | |
self.welcome() | |
username = self.set_nickname() | |
self.chat(username) | |
class ChatTCPServer(ThreadingTCPServer): | |
pass | |
def message_broker(): | |
global session_pool | |
global message_queue | |
while True: | |
msg = message_queue.get() | |
for username, session in session_pool.items(): | |
try: | |
session.sendall(msg) | |
except: | |
session_pool.pop(username) | |
msg = "[!] Exited User: %(username)s\r\n" % { | |
'username': username | |
} | |
message_queue.put(msg) | |
message_queue.task_done() | |
def main(): | |
global message_queue | |
server = ChatTCPServer((HOST, PORT), ChatTCPRequestHandler) | |
ip, port = server.server_address | |
server = threading.Thread(target=server.serve_forever) | |
server.daemon = True | |
server.start() | |
broker = threading.Thread(target=message_broker) | |
broker.daemon = True | |
broker.start() | |
print "[!] Chat Server running on %s:%s" % (ip, port) | |
while True: | |
if raw_input() is 'q': | |
break | |
message_queue.join() | |
server.shutdown() | |
server.server_close() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment