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()
    
  • 相关阅读:
    HDU 5213 分块 容斥
    HDU 2298 三分
    HDU 5144 三分
    HDU 5145 分块 莫队
    HDU 3938 并查集
    HDU 3926 并查集 图同构简单判断 STL
    POJ 2431 优先队列
    HDU 1811 拓扑排序 并查集
    HDU 2685 GCD推导
    HDU 4496 并查集 逆向思维
  • 原文地址:https://www.cnblogs.com/raygor/p/13394667.html
Copyright © 2011-2022 走看看