客户端:

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

服务器:

  1. import socket
  2. import os
  3.  
  4. '''
  5. 注意1:
  6. send一次性把结果发送给客户端了。
  7. 但客户端只接了1024,剩下的没有扔,放到了缓冲区buffer了
  8. 下一次send把缓冲区的先发出去,再把新的数据放入缓冲区
  9. 客户端虽然写的收1024.代表最多收1024.
  10. 1、缓冲区满了自动发
  11. 2、用send强制发
  12. 所以send的意思是:
  13. 如果缓冲区有数据,就从缓冲区发送一次客户端最大能接收的数据。再把新数据放到缓冲区
  14. 如果缓冲区没数据,就把新数据放入缓冲区,再从缓冲区发送一次客户端最大能接收的数据
  15.  
  16. 注意2:
  17. len方法判断长度的时候,如果是中文encode之前和之后的长度可能不一样,注意区分
  18. '''
  19. server = socket.socket()
  20. server.bind(("0.0.0.0", 9999))
  21. server.listen()
  22.  
  23. while True:
  24. conn, address = server.accept()
  25. print("来自客户端的连接:", conn)
  26. while True:
  27. cmd = conn.recv(1024).decode("utf-8")
  28. if not cmd: # 如果客户端断开,cmd会进入死循环,一直接收到空字符串
  29. print("client is lost...")
  30. break
  31. res = os.popen(cmd).read()
  32. if len(res) == 0: # 如果命令执行不成功,暂时返回特定的提示
  33. res = "cmd has not output"
  34. conn.send(str(len(res.encode("utf-8"))).encode("utf-8")) # 这里注意:有中文的时候编码前和编码后的长度不一样。这里的是编码后的长度
  35. conn.send(res.encode("utf-8"))

socket接收大数据流的更多相关文章

  1. 网络编程基础【day09】:socket接收大数据(五)

    本节内容 1.概述 2.socket接收大数据 3.中文字符的坑 一.概述 上篇博客写到了,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区 ...

  2. 【python】-- Socket接收大数据

    Socket接收大数据 上一篇博客中的简单ssh实例,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区中,这样就会造成我们想要获取数据的完整 ...

  3. 网络编程 - socket接收大数据

    通过socket,实现客户端发送命令,将服务端执行出的结果,反回到客户端,主要4个步骤:1.服务端返回数据: 2.服务端返回数据的大小: 3.客户端接收返回数据的大小: 4.客户端按返回数据大小接收数 ...

  4. Socket接收大数据的方法

    byte[] buffer = new byte[BufferSize]; int bytesRead; // 读取的字节数 MemoryStream msStream = new MemoryStr ...

  5. C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  6. 利用Socket进行大文件传输

    分类: WINDOWS 最近接触到利用socket进行大文件传输的技术,有些心得,与大家分享.首先看看这个过程是怎么进行的(如下图):      所以,我们需要三个socket在窗体加载的时候初始化: ...

  7. 嵌入式 vlc从接收到数据流到播放视频的过程分析(经典)

    个人整理: Vlc流播放流程 vlc源码目录树: 目录名称 说明 bindings Java, CIL 和Python绑定 doc 帮助文档 (不是更新的) extras 另叙. include VL ...

  8. 基于socket实现大文件上传

    import socket 1.客户端: 操作流程: 先拿到文件--->获取文件大小---->创建字典 1.制作表头 header  如何得到 他是一个二进制字符串 序列化得到 字典字符串 ...

  9. android开发 socket接收图片并保存

    逻辑:接收到socket之后需要将socket发送的图片数据保存下来并通知handler更新界面 关键代码: public void readImage(Socket socket) { try { ...

随机推荐

  1. .net core 2.0 Code First Fluent API配置

    A.net core 2.0新特性支持通过IEntityTypeConfiguration<>添加Code First配置到一个封装类. 新建目标框架为.NET Core类库 新建完了以后 ...

  2. CentOS 6.5中安装使用dstat资源统计工具

    目录 1 dstat工具的使用 1.1 什么是dstat 1.2 dstat的基本使用 1.3 检测界面各参数的含义 1.4 dstat 的高级用法 2 dstat工具的安装 2.1 (推荐)通过yu ...

  3. SpringBoot入门教程(十六)@Autowired、@Inject、@Resource

    @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中.详情参见下表: v区别 ANNOTATION PACKAGE SOURCE 作用域 实现方 ...

  4. Java 技术笔记

    vlist提取字段生成新list List<int> uidList = urResult.stream().map(p -> p.getUserId()).collect(Coll ...

  5. Nginx 优化静态文件访问

    简介 Web 开发中需要的静态文件有:CSS.JS.字体.图片,可以通过web框架进行访问,但是效率不是最优的. Nginx 对于处理静态文件的效率要远高于 Web 框架,因为可以使用 gzip 压缩 ...

  6. Kafka~Linux环境下的部署

    概念 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据 ...

  7. API网关模式

    什么是网关 网关一词来源于计算机网络中的定义,网关(Gateway)又称网间连接器.协议转换器.网关的准确定义是: 两个计算机程序或系统之间的连接,网关作为两个程序之间的门户,允许它们通过不同计算机之 ...

  8. Java多线程概念简介 多线程中篇(一)

    Java的线程与操作系统的线程   在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...

  9. c语言之gdb调试。

    1.此文档演示如何使用gdb调试c语言代码. 代码如下: #include <stdio.h> /*函数声明*/ void digui(int n); int main() { ; dig ...

  10. Orchard学习资料,适合入门上手

    名词解释: http://www.cnblogs.com/esshs/archive/2011/06/01/2067501.html   Orchard如何工作: http://www.cnblogs ...