All pastes #1595547 Raw Edit

Stuff

public python v1 · immutable
#1595547 ·published 2009-10-05 20:13 UTC
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()