#!/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()