Skip to content

Instantly share code, notes, and snippets.

@posquit0
Created October 19, 2015 10:55
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 posquit0/2ab784630a2f20595a22 to your computer and use it in GitHub Desktop.
Save posquit0/2ab784630a2f20595a22 to your computer and use it in GitHub Desktop.
Simple Chat Server with Python (Not needed Client Interface)
#!/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