zoukankan      html  css  js  c++  java
  • socket接收大数据流

    客户端:

    import socket
    
    client = socket.socket()
    client.connect(("127.0.0.1", 9999))
    
    while True:
        cmd = input(">>").strip()
        if not cmd:                     # 不能发送空字符串,否则在接收端的recv方法会阻塞
            continue
        client.send(cmd.encode("utf-8"))
        len_res = int(client.recv(1024).decode("utf-8"))   # 这里的长度是服务端发送的数据编码后的长度
    
        length = 0
        total_data = b''                # 用空字符串循环接收bytes.接收完了再decode,因为分次接收每次decode可能会出错
        while True:
            res = client.recv(8192)
            total_data += res
            length += len(res)
            if length == len_res:break
        print(total_data.decode("utf-8"))
        print("命令大小>>", len_res)
        print("收到的结果大小",length)

    服务器:

    import socket
    import os
    
    '''
    注意1:
    send一次性把结果发送给客户端了。
    但客户端只接了1024,剩下的没有扔,放到了缓冲区buffer了
    下一次send把缓冲区的先发出去,再把新的数据放入缓冲区
    客户端虽然写的收1024.代表最多收1024.
    1、缓冲区满了自动发
    2、用send强制发
    所以send的意思是:
    如果缓冲区有数据,就从缓冲区发送一次客户端最大能接收的数据。再把新数据放到缓冲区
    如果缓冲区没数据,就把新数据放入缓冲区,再从缓冲区发送一次客户端最大能接收的数据
    
    注意2:
    len方法判断长度的时候,如果是中文encode之前和之后的长度可能不一样,注意区分
    '''
    server = socket.socket()
    server.bind(("0.0.0.0", 9999))
    server.listen()
    
    while True:
        conn, address = server.accept()
        print("来自客户端的连接:", conn)
        while True:
            cmd = conn.recv(1024).decode("utf-8")
            if not cmd:                        # 如果客户端断开,cmd会进入死循环,一直接收到空字符串
                print("client is lost...")
                break
            res = os.popen(cmd).read()
            if len(res) == 0:                   # 如果命令执行不成功,暂时返回特定的提示
                res = "cmd has not output"
            conn.send(str(len(res.encode("utf-8"))).encode("utf-8")) # 这里注意:有中文的时候编码前和编码后的长度不一样。这里的是编码后的长度
            conn.send(res.encode("utf-8"))
  • 相关阅读:
    NOI-1.1-04输出保留3位小数的浮点数
    百练7619-合影效果-2015正式D题-简单排序&输出格式
    百练6376-二维数组右上左下遍历-2015正式C题
    C++ 开发环境配置
    go语言 http学习
    Git 命令及分支管理学习
    配置go语言编辑环境
    DNS的过程
    Split Array into Consecutive Subsequences
    组委会正在为美团点评CodeM大赛的决赛设计新赛制
  • 原文地址:https://www.cnblogs.com/staff/p/9642128.html
Copyright © 2011-2022 走看看