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"))
  • 相关阅读:
    PAT 1097. Deduplication on a Linked List (链表)
    PAT 1096. Consecutive Factors
    PAT 1095. Cars on Campus
    PAT 1094. The Largest Generation (层级遍历)
    PAT 1093. Count PAT's
    PAT 1092. To Buy or Not to Buy
    PAT 1091. Acute Stroke (bfs)
    CSS:word-wrap/overflow/transition
    node-webkit中的requirejs报错问题:path must be a string error in Require.js
    script加载之defer和async
  • 原文地址:https://www.cnblogs.com/staff/p/9642128.html
Copyright © 2011-2022 走看看