rendered paste body#!/usr/bin/pythonfrom threading import Threadfrom Pyro.errors import NamingError, ConnectionClosedErrorimport Pyro.core, Pyro.naming, getopt, sysDEF_NS_HOST = 'localhost'DEF_NS_PORT = 9090DEF_SERVER_HOST = DEF_NS_HOSTDEF_SERVER_PORT = 7766SERVER_OBJ_NAME = ':CHAT.SERVER-411' class ChatClient(Pyro.core.SynchronizedObjBase): def __init__(self, server=None, server_host=None, server_port=None): Pyro.core.SynchronizedObjBase.__init__(self) if server: self.server = server else: self.server = Pyro.core.getProxyForURI('PYROLOC://%s:%s/%s' % (server_host, server_port, SERVER_OBJ_NAME)) self.exit = 0 def new_msg(self, uid, msg): print self.print_prompt(uid) + msg def print_prompt(self, uid): return '\n-' + uid + '->> ' def init_chat(self): try: self.uid = raw_input('Choose a username: ') # Ensure that we have a separate thread to send and receive message self.input_thread=Thread(target=self.handle_input) self.input_thread.start() self.server.join(self.uid, self.getProxy()) except ValueError as ex: print ('Error occured: ' + str(ex)) def handle_input(self): self.exit = 0 print ('To quit, type \'/exit\'. NOTE: Ctrl+C is not supported!') try: try: while not self.exit: input = raw_input(self.print_prompt(self.uid)) if input == '/exit': break if input: self.server.send_msg(self.uid, input) except EOFError: pass finally: self.server.quit(self.uid) self.exit = 1 print ('Exiting input thread') def user_new(self, uid): print '%s has joined' % uid def user_exit(self, uid): print '%s has quit' % uiddef loop(client, daemon): try: daemon.requestLoop(lambda: not client.exit) except KeyboardInterrupt: print ('Leaving chat room... ') client.exit = 1def main(): try: opts, extraparams = getopt.getopt(sys.argv[1:], 'hn:p:s:t:', ['help', 'ns-host=', 'ns-port=', 'server-host=', 'server-port=']) except getopt.GetoptError, err: print str(err) sys.exit(1) ns_host = DEF_NS_HOST ns_port = DEF_NS_PORT server_host = None server_port = None for o, a in opts: if o in ('-h', '--help'): #usage() print ('print USAGE here') sys.exit(1) elif o in ('-n', '--ns-host'): ns_host = a elif o in ('-p', '--ns-port'): ns_port = int(a) elif o in ('-s', '--server-host'): server_host = a elif o in ('-t', '--server-port'): server_port = int(a) else: assert False, 'Option is not supported' Pyro.core.initServer() Pyro.core.initClient() daemon = Pyro.core.Daemon() ns = Pyro.naming.NameServerLocator().getNS(host=ns_host, port=ns_port) daemon.useNameServer(ns) server = ns.resolve(SERVER_OBJ_NAME).getProxy() server_host = server.URI.address server_port = server.URI.port print ('Connected to Name Server at: %s:%s' % (ns_host,ns_port)) print ('Connected to Chat Server at: %s:%s' % (server_host,server_port)) client = ChatClient(server) uri = daemon.connect(client) print ('Hosting ChatClient at: ' + uri.address + ':' + str(uri.port)) thread=Thread(target=loop, args=(client, daemon)) thread.start() client.init_chat() thread.join() print 'Leaving chat room...'if __name__ == '__main__': main()