python简单的多人聊天室

发布时间:2019-09-12 07:55:01编辑:auto阅读(1298)

    刚开始学习python,写了一个聊天室练练手。

    Server.py

    import socket,select,thread;
    
    host=socket.gethostname()
    port=5963
    addr=(host,port)
         
    inputs=[]
    fd_name={}
    
    def who_in_room(w):
        name_list=[]
        for k in w:
            name_list.append(w[k])
            
        return name_list
    
    def conn():
        print 'runing'
        ss=socket.socket()
        ss.bind(addr)
        ss.listen(5)
        
        return ss
    
    def new_coming(ss):
        client,add=ss.accept()
        print 'welcome %s %s' % (client,add)
        wel='''welcome into the talking room .
        please decide your name.....'''
        try:
            client.send(wel)
            name=client.recv(1024)
            inputs.append(client)
            fd_name[client]=name
            
            nameList="Some people in talking room, these are %s" % (who_in_room(fd_name))
            client.send(nameList)
            
        except Exception,e:
            print e
        
    def server_run():
    
        ss=conn()
        inputs.append(ss)
        
        while True:
            r,w,e=select.select(inputs,[],[])
            for temp in r:
                if temp is ss:
                    new_coming(ss)
                else:
                    disconnect=False
                    try:
                        data= temp.recv(1024)
                        data=fd_name[temp]+' say : '+data
                    except socket.error:
                        data=fd_name[temp]+' leave the room'
                        disconnect=True
                        
                    if disconnect:
                        inputs.remove(temp)
                        print data
                        for other in inputs:
                            if other!=ss and other!=temp:
                                try:
                                    other.send(data)
                                except Exception,e:
                                    print e                    
                        del fd_name[temp]
                        
                    else:
                        print data
                        
                        for other in inputs:
                            if other!=ss and other!=temp:
                                try:
                                    other.send(data)
                                except Exception,e:
                                    print e
        
    if __name__=='__main__':
        server_run()

    client.py

    import socket,select,threading,sys;
    
    host=socket.gethostname()
    
    addr=(host,5963)
    
    def conn():
        s=socket.socket()
        s.connect(addr)
        return s
    
    def lis(s):
        my=[s]
        while True:
            r,w,e=select.select(my,[],[])
            if s in r:
                try:
                    print s.recv(1024)
                except socket.error:
                    print 'socket is error'
                    exit()
                
    def talk(s):
        while True:
            try:
                info=raw_input()
            except Exception,e:
                print 'can\'t input'
                exit()
            try:
                s.send(info)
            except Exception,e:
                print e
                exit()
                
    def main():
        ss=conn()
        t=threading.Thread(target=lis,args=(ss,))
        t.start()
        t1=threading.Thread(target=talk,args=(ss,))
        t1.start()
    if __name__=='__main__':
        main()

    运行时先启动服务端。进入聊天室先起一个昵称。服务端会向客户端发送当前聊天室内聊天人的列表。一个客户端发出的消息会通过服务端发给其他客户端。


    效果如下:


关键字