Skip to content

Instantly share code, notes, and snippets.

@storborg
Created January 20, 2011 23:35
Show Gist options
  • Select an option

  • Save storborg/788941 to your computer and use it in GitHub Desktop.

Select an option

Save storborg/788941 to your computer and use it in GitHub Desktop.
import asyncore
import asynchat
import socket
class TalkHandler(asynchat.async_chat):
def __init__(self, server, conn, name):
asynchat.async_chat.__init__(self, conn)
self.name = name
self.server = server
self.set_terminator('\r\n')
self.buf = ''
def collect_incoming_data(self, s):
self.buf += s
def found_terminator(self):
if self.buf == 'quit':
self.server.shout("%s has left." % self.name,
except_to=self)
self.close()
elif self.buf.lower().startswith('i am'):
new_name = self.buf[5:]
self.server.shout("%s is now known as %s" %
(self.name, new_name))
self.name = new_name
else:
self.server.shout("%s: %s" % (self.name, self.buf),
except_to=self)
self.buf = ''
def handle_close(self):
asynchat.async_chat.handle_close(self)
self.server.hangup(self)
class TalkServer(asyncore.dispatcher):
def __init__(self):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind(('127.0.0.1', 31337))
self.listen(5)
self.clients = []
self.client_num = 1
def hangup(self, client):
self.clients.remove(client)
def shout(self, buf, except_to=None):
print buf
for client in self.clients:
if client != except_to:
client.push("%s\r\n" % buf)
def handle_accept(self):
conn, addr = self.accept()
name = "Anonymous %d" % self.client_num
self.client_num += 1
self.shout("Welcome %s." % name)
self.clients.append(TalkHandler(self, conn, name))
if __name__ == '__main__':
server = TalkServer()
print "Starting server..."
asyncore.loop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment