• socket 粘包


    ---恢复内容开始---

    socket粘包:两个包连在一起了

    解决办法,在两个包之间的信息接收一个返回信息

    import socket
    import os
    # import time
    server = socket.socket()
    server.bind(('localhost',6969))
    server.listen()
    
    while True:
        conn,addr = server.accept()
        print("new conn :",addr)
        while True:
            data = conn.recv(1024)
            if not data:
                print("客户端已经断开")
                break
            print("执行指令:",data)
            cmd_res = os.popen(data.decode('utf-8')).read()
            if len(cmd_res) == 0:
                cmd_res = "cmd has no output,,,"
    
            conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8'))
            # time.sleep(0.5)
            '''-----------------------------------'''
            client_ack = conn.recv(1024) # wait client to continue
            '''-----------------------------------'''
            print("client_ack:",client_ack.decode())
            conn.send(cmd_res.encode('utf-8'))
            print("send done")
    
    server.close()
    server
    #客户端
    import socket
    
    client = socket.socket()
    client.connect(('localhost',6969))
    
    while True:
        cmd = input(">>:").strip()
        if len(cmd) == 0: continue
        client.send(cmd.encode('utf-8'))
        cmd_res_size = client.recv(1024)
        print('命令结果大小:',cmd_res_size.decode())
        '''-------------------'''
        client.send("准备好啦".encode("utf-8"))
        '''-------------------'''
        size = 0
        receive_data = b''
        while size < int(cmd_res_size.decode()):
            data = client.recv(1024)
            size += len(data)
            receive_data += data
        else:
            print(receive_data.decode())
            print("cmd res receive donr,,,,",size)
    
    client.close()
    client

    ftp server

    1.读取文件名  2.检测文件是否存在 3.打开文件 4.检测文件大小 5.发送文件大小和md5给客户端

    6.接受客户端确认信息(防止粘包) 7.开始边读边发

    ---恢复内容结束---

    import socket,os
    import hashlib
    server = socket.socket()
    server.bind(('localhost',6969))
    server.listen()
    
    while True:
        conn,addr = server.accept()
        print("new conn :",addr)
        while True:
            data = conn.recv(1024)
            if not data:
                print("客户端已经断开")
                break
            cmd,filename = data.decode().split()
            print(filename)
            if os.path.isfile(filename):
                f = open(filename,'rb')
                m = hashlib.md5()
                file_size = os.stat(filename).st_size   # 获取文件大小
                conn.send(str(file_size).encode('utf-8'))
                conn.recv(1024) # wait client ack
                for line in f:
                    m.update(line)
                    conn.send(line)
                print("file md5:",m.hexdigest())
                f.close()
                conn.send(m.hexdigest().encode())
            print("send done")
    
    server.close()
    ftp_server
    import socket
    import hashlib
    
    client = socket.socket()
    client.connect(('localhost',6969))
    
    while True:
        cmd = input(">>:").strip()
        if len(cmd) == 0: continue
        if cmd.startswith("get"):
            client.send(cmd.encode('utf-8'))
            server_response = client.recv(1024)
            print("server_response:",server_response)
            client.send(b"ready to recv file")
            file_total_size = int(server_response.decode())
            received_size = 0
            filename = cmd.split()[1]
            f = open("new.docx","wb")
            m = hashlib.md5()
            while received_size < file_total_size:
                if file_total_size - received_size >= 1024:
                    size = 1024
                else:   # 最后一次,剩下多少收多少
                    size = file_total_size - received_size
                    print("--------",size)      # 防止服务器两次send 粘包
                data = client.recv(size)
                received_size += len(data)
                m.update(data)
                f.write(data)
                print(file_total_size,received_size)
            else:
                new_file_md5 = m.hexdigest()
                print("file recv done")
                f.close()
            server_file_md5 = client.recv(1024)
            print("server file md5:",server_file_md5)
            print("client file md5:",new_file_md5)
    
    client.close()
    ftp_client

    .

  • 相关阅读:
    JS垃圾回收机制
    Flex布局
    HTTP请求
    css基本布局方式
    阮一峰《ECMAScript 6 入门》读书笔记——模版标签
    阮一峰《ECMAScript 6 入门》读书笔记——变量解构赋值
    阮一峰《ECMAScript 6 入门》读书笔记——let与const
    闭包(Closure)
    CSS浮动布局带来的高度塌陷以及其解决办法
    CSS网页的布局
  • 原文地址:https://www.cnblogs.com/yfjly/p/9978746.html
Copyright © 2020-2023  润新知