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()
    
  • 相关阅读:
    【链接】idea没有svn
    移动端适配解决方案
    项目中多个文件引入同一份公共样式less文件导致编译打包后有多份样式
    2020最新编辑器集成eslint、prettier、stylelint,git提交预检查代码配置
    eslint+prettier学习
    artTempate模版继承父模版之后再引入子模版不生效?
    iOS底层原理开篇
    iOS应用千万级架构:安全与加密
    使用RabbitMQ实现延迟任务
    JAVA三元运算符空指针引用的坑
  • 原文地址:https://www.cnblogs.com/raygor/p/13394667.html
Copyright © 2011-2022 走看看