#!/usr/bin/python import Pyro.core import Pyro.naming import Pyro.util import sys import logging from Pyro.errors import NamingError from threading import Thread GROUP_NAME = ':CHAT' OBJ_NAME = GROUP_NAME + '.SERVER-411' class ChatServer(Pyro.core.SynchronizedObjBase): def __init__(self): Pyro.core.SynchronizedObjBase.__init__(self) self.uid_cb_pairs = {} def join(self, uid, callback): if uid in self.uid_cb_pairs: raise ValueError('User ID \'' + uid + '\' has already been taken') # add user callback._setOneway(['user_new', 'user_exit', 'new_msg']) self.uid_cb_pairs[uid] = callback print('User %s has joined the chat' % uid) # notify others of new user and new user of others for u, cb in self.uid_cb_pairs.iteritems(): if u != uid: cb.user_new(uid) callback.user_new(u) def quit(self, uid): if uid not in self.uid_cb_pairs: raise ValueError('User ID %s not in the list of users' % uid) del self.uid_cb_pairs[uid] for cb in self.uid_cb_pairs.itervalues(): cb.user_exit(uid) def send_msg(self, uid, msg): print('%s said %s' % (uid, msg)) for u, cb in self.uid_cb_pairs.iteritems(): if u != uid: cb.new_msg(uid, msg) def main(): Pyro.core.initServer() daemon = Pyro.core.Daemon() ns = Pyro.naming.NameServerLocator().getNS() print ('Connected to Name Server at: ' + ns.URI.address + ':' + str(ns.URI.port)) daemon.useNameServer(ns) # ensure that no same obj name already registered in NS try: ns.createGroup(GROUP_NAME) except NamingError: pass try: ns.unregister(OBJ_NAME) except NamingError: pass uri = daemon.connect(ChatServer(), OBJ_NAME) print ('Hosting ChatServer at: ' + uri.address + ':' + str(uri.port)) daemon.requestLoop() if __name__=='__main__': main()