• 28 练习:TCP协议 UDP协议 黏包


    # 1.基于tcp协议完成登录认证
    # 客户端输入用户名密码
    # 发送到服务端
    # 服务端认证
    # 发送结果到客户端
    
    # server.py
    import socket
    import struct
    
    REGISTER_PATH = 'register'
    User = None
    sk = socket.socket()
    sk.bind(('127.0.0.1', 9000))
    sk.listen()
    
    conn, addr = sk.accept()
    b_length = conn.recv(4)
    length = struct.unpack('i', b_length)[0]
    username = conn.recv(length)
    b_length = conn.recv(4)
    length = struct.unpack('i', b_length)[0]
    password = conn.recv(length)
    with open(REGISTER_PATH, encoding='utf-8', mode='r') as file_handler:
        for line in file_handler:
            cmp_username, cmp_password = line.strip().split('|')
            if cmp_username == username and cmp_password == password:
                conn.send('login success.'.encode('utf-8'))
                User = username
        if User is None:
            conn.send('login fail.'.encode('utf-8'))
    conn.close()
    
    sk.close()
    
    # client.py
    import socket
    import struct
    
    sk = socket.socket()
    sk.connect(('127.0.0.1', 9000))
    
    username = input('username>>>')
    password = input('password>>>')
    b_length = struct.pack('i', len(username))
    sk.send(b_length)
    sk.send(username.encode('utf-8'))
    b_length = struct.pack('i', len(password))
    sk.send(b_length)
    sk.send(password.encode('utf-8'))
    ret = sk.recv(1024)
    print(ret)
    
    sk.close()
    
    # 2.基于udp协议的多人聊天
    # 自动识别用户 不能用ip和port
    
    # server.py
    import socket
    import random
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1', 9000))
    color_dic = {}
    
    while True:
        info, addr = sk.recvfrom(1024)
        name, msg = info.decode('utf-8').strip().split('|')
        if name not in color_dic:
            while True:
                forecolor_num = random.randint(31, 37)
                color_dic.setdefault(name, forecolor_num)
        print(f'33[{color_dic[name]}m: msg')
        r_msg = input('>>>')
        sk.sendto(r_msg.encode('utf-8'), addr)
    
    sk.close()
    
    # client.py
    import socket
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    server = ('127.0.0.1', 9000)
    
    name = input('name>>>')
    while True:
        msg = input('>>>')
        send_bytes = (name + '|' + msg).encode('utf-8')
        sk.sendto(send_bytes, server)
        r_msg = sk.recv(1024).decode('utf-8')
        if r_msg.upper() == 'Q':
            break
        print(r_msg)
    
    sk.close()
    # 3.基于tcp协议完成一个文件的上传
    # 小文件
    
    # server.py
    import socket
    import struct
    
    sk = socket.socket()
    sk.bind(('127.0.0.1', 9000))
    sk.listen()
    
    conn, addr = sk.accept()
    b_length = conn.recv(4)
    length = struct.unpack('i', b_length)[0]
    file_name = conn.recv(length).decode('utf-8')
    b_length = conn.recv(4)
    length = struct.unpack('i', b_length)[0]
    file_data = conn.recv(length)
    with open(file_name + '.bak', mode='wb') as file_handler:
        file_handler.write(file_data)
    conn.close()
    
    sk.close()
    
    # client.py
    import socket
    import struct
    
    sk = socket.socket()
    
    sk.connect(('127.0.0.1', 9000))
    file_name = input('filename>>>')
    b_length = struct.pack('i', len(file_name))
    sk.send(b_length)
    sk.send(file_name.encode('utf-8'))
    with open(file_name, mode='rb') as file_handler:
        file_data = file_handler.read()
    b_length = struct.pack('i', len(file_data))
    sk.send(b_length)
    sk.send(file_data)
    
    sk.close()
    
  • 相关阅读:
    从无到有制作Deb包的一个实例
    Redis内存存储结构分析
    岳麓实践论
    金砖四国(巴西、俄罗斯、印度和中国)
    用LLVM开发新语言
    QQ云输入法
    http://baike.baidu.com/view/1926473.htm
    21世纪商业评论
    update ubuntu to 11.10
    gnu make 中文手册教程pdf
  • 原文地址:https://www.cnblogs.com/raygor/p/13394667.html
Copyright © 2020-2023  润新知