• socket 实现一个类似简单聊天室的功能(多客户端互相通信)


    server端:

    #coding=utf-8
    '''
    一个广播程序,linux运行
    '''
    import select,socket
    
    import traceback
    
    
    
    def broadcast(conn,message):
        for i in conn_list:
            if i!=sk and i!=conn:
                try:
                    i.send(message.encode())
                except:
                    conn.close()
                    conn_list.remove(i)
    
    
    if __name__=='__main__':
        conn_list=[]
        buffer_size=4096
        
        sk=socket.socket()
        sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        sk.bind(('127.0.0.1',9789))
        sk.listen(5)
        conn_list.append(sk)
        print('Chat server started on port 9789')
    
        while 1:
            print('while wai: mission list:',conn_list)
            read_sock,write_sock,error_sock=select.select(conn_list,[],[])
            for i in read_sock:
                print('for mission list:',conn_list)
                if i==sk:
                    conn,addr=sk.accept()
                    conn_list.append(conn)
                    print('client (%s,%s) connected'%addr)
    
                    print('socket server broadcast now!')
                    broadcast(conn,'(%s,%s) entered room '%addr)
                
                else:
                    try:
                        data=i.recv(4096) #buffer_size
                        
                        if data:
                            print('recv data:',data.decode())
                            print('received from conn broadcast2 now!')
                            broadcast(i,'from client %s:'%str(i.getpeername())+data.decode()+'
    ')
    
                        elif data.strip()=='' or data.strip()=='bye':
                            print('client %s close!'%str(i.getpeername()))
                            i.close()
                            conn_list.remove(i)
                            break
                        else:
                            print('client %s close!'%str(i.getpeername())) 
                            i.close()
                            conn_list.remove(i)
                            break
                        
                    except:
                        traceback.print_exc()
                        print('%s is offline!'%str(i.getpeername()))
                        i.close()
                        conn_list.remove(i)
                        #continue
                        break
        sk.close()

    client端:

    #coding=utf-8
    '''
    client
    '''
    
    import socket,select,string,sys
    
    def prompt():
        #sys.stdout.write('<You>')
        #sys.stdout.flush()
        print('<You>')
    
    if __name__=='__main__':
        '''
        if len(sys.argv)<3:
            print('参数错误!')
            sys.exit()
        
        host=sys.argv[1]
        port=int(sys.argv[2])
        '''
    
        sk=socket.socket()
        try:
            #sk.connect((host,port))
            sk.connect(('127.0.0.1',9789))
        except:
            print('unable to connect')
            sys.exit()
        
        print('connected success,send message')
        prompt()
    
        while 1:
            ll=[sys.stdin,sk]
            read_l,write_l,error=select.select(ll,[],[])
    
            for i in read_l:
                if i==sk:
                    data=sk.recv(4096)
                    if not data:
                        pass
                        
                    else:
                        sys.stdout.write(data.decode())
                        prompt()
                else:
                    msg=sys.stdin.readline()
                    if not (msg.strip()=='' or msg.strip()=='bye'):
                        sk.send(msg.encode())
                        prompt()
                    else:
                        sk.close()
                        ll.clear()
                        break
            if len(ll)==0:
                break
        sys.exit()
        
  • 相关阅读:
    数据脱敏工具类
    oracle根据身份证号码 计算年龄、性别
    mysql 中通过身份证号码计算年龄
    解决POI读取Excel如何判断行是不是为空
    oralce 将浮点型字段,转为指定精度 并且四舍五入
    mysql too many connections
    spring boot @Transactional的一个小坑
    webpack4下url-loader打包图片问题
    使用extract-text-webpack-plugin插件后报错
    MySQL服务意外停止
  • 原文地址:https://www.cnblogs.com/xiaoxiao075/p/10511676.html
Copyright © 2020-2023  润新知