zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    [树形dp] Luogu P4516 潜入行动
    [kruskal][Trie] Codeforces 888G Xor-MST
    [线性基] Luogu P4151 最大XOR和路径
    [线段树] Luogu P4560 砖墙
    [递归][重心] Luogu P4886 快递员
    [Trie][贪心][堆] LibreOJ #3048 异或粽子
    [长链剖分][优先队列] LibreOJ #3052 春节十二响
    [支配树] Bzoj P2815 灾难
    [长链剖分][线段树] Bzoj P1758 重建计划
    [dsu on tree] Codeforces 600E Lomsat gelral
  • 原文地址:https://www.cnblogs.com/raygor/p/13394667.html
Copyright © 2011-2022 走看看