zoukankan      html  css  js  c++  java
  • 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

    .

  • 相关阅读:
    git 命令图解
    tensorflow 保存及其加载
    tensorflow estimator 与 model_fn 是这样沟通的
    面向过程、面向函数、面向对象的区别浅谈
    Python 中自定义spark转换器
    pyspark 好用多了,放弃scala
    variable_scope 与 name_scope 区别
    tensorflow 条件语句与循环语句
    html 标签内部元素上下居中
    html 标签内部元素左右居中
  • 原文地址:https://www.cnblogs.com/yfjly/p/9978746.html
Copyright © 2011-2022 走看看