美文网首页
利用python Socket实现udp聊天室

利用python Socket实现udp聊天室

作者: Gcider | 来源:发表于2018-12-28 13:56 被阅读0次

    效果图:

    1.gif

    使用Python socket编程实现简单的聊天室功能。

    服务器和客户端使用UDP编程,客户端两个线程一个负责接收,一个负责发送。

    服务器:接收消息并保存地址,如果触发‘EXIT’关键字则从地址表中移除该地址

    
    def main():
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
        addr = ('127.0.0.1', 9999)
        s.bind(addr)
    
        logging.info('UDP Server on %s:%s...', addr[0], addr[1])
    
        user = {}  # {addr:name}
        while True:
            try:
                data, addr = s.recvfrom(1024)
                if not addr in user:
                    for address in user:
                        s.sendto(data + ' 进入聊天室...'.encode(), address)
                    user[addr] = data.decode('utf-8')
                    continue
    
                if 'EXIT' in data.decode('utf-8'):
                    name = user[addr]
                    user.pop(addr)
                    for address in user:
                        s.sendto((name + ' 离开了聊天室...').encode(), address)
                else:
                    print('"%s" from %s:%s' %
                          (data.decode('utf-8'), addr[0], addr[1]))
                    for address in user:
                        if address != addr:
                            s.sendto(data, address)
    
            except ConnectionResetError:
                logging.warning('Someone left unexcept.')
    
    

    客户端:两个线程,并设置接收线程为守护线程

    def recv(sock, addr):
        '''
        一个UDP连接在接收消息前必须要让系统知道所占端口
        也就是需要send一次,否则win下会报错
        “   data=sock.recv(1024)
            OSError: [WinError 10022] 提供了一个无效的参数。   ”
        '''
        sock.sendto(name.encode('utf-8'), addr)
        while True:
            data = sock.recv(1024)
            print(data.decode('utf-8'))
    
    
    def send(sock, addr):
        while True:
            string = input()
            message = name + ' : ' + string
            data = message.encode('utf-8')
            sock.sendto(data, addr)
            if string == 'EXIT':
                break
    
    def main():
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        server = ('127.0.0.1', 9999)
    
        tr = threading.Thread(target=recv, args=(s, server), daemon=True)
        ts = threading.Thread(target=send, args=(s, server))
        tr.start()
        ts.start()
        ts.join()
        s.close()
    
    if __name__ == '__main__':
        print("-----欢迎来到聊天室,退出聊天室请输入'EXIT'-----")
        name = input('请输入你的名称:')
        print('-----------------%s------------------' % name)
        main()
    
    

    可以通过继承socket.socket类来重构,那样子显得跟规范一些

    相关文章

      网友评论

          本文标题:利用python Socket实现udp聊天室

          本文链接:https://www.haomeiwen.com/subject/myvslqtx.html