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"))

 

posted on 2018-09-13 18:03 要一直走下去 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/staff/p/9642128.html

Socket类是Java中负责处理客户端通信的类。它提供了发送和接收数据的方法。在实现Socket发送数据的过程中,可以通过以下步骤来进行: 1. 创建一个Socket对象,指定服务器的IP地址和端口号。 2. 获取该Socket对象的输出流,通过该输出流向服务器发送数据。 3. 使用输出流的write方法将要发送的数据写入缓冲区。 4. 调用输出流的flush方法,将缓冲区中的数据发送到服务器。 5. 关闭输出流。 在实现Socket接收数据的过程中,可以通过以下步骤来进行: 1. 创建一个Socket对象,指定服务器的IP地址和端口号。 2. 获取该Socket对象的输入流,通过该输入流从服务器接收数据。 3. 使用输入流的read方法读取服务器发送过来的数据。 4. 关闭输入流。 需要注意的是,发送和接收数据的操作通常是在不同的线程中进行的,以避免阻塞。因此,在实际使用中,可以通过多线程的方式来实现Socket的发送和接收数据的功能。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [java使用Socket接收和发送数据](https://download.csdn.net/download/weixin_38752074/12792212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [模拟实现通过使用多个WiFi模块+串口助手进行数据发送,采用socket协议,接收数据进行解析](https://download.csdn.net/download/weixin_46549923/85705653)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值