网络编程基础【day09】:socket接收大数据(五)
本节内容
1、概述
2、socket接收大数据
3、中文字符的坑
一、概述
上篇博客写到了,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区中,那我们如何解决这个问题呢?
有的同学就说了:
- 改大客户端接收的数据的大小=>这个方案并不能解决问题,因为官方建议最多只能接收8k的数据,那服务端发送过来的数据大于8K咋办,很显然不行
- 客户端可以多收几次=>客户端需要收多少次,才能把这个命令返回的结果全部收回来呢?并且怎么确定这条命令返回的结果已经被全部收回来了呢?
很明显,上面第二种思路靠谱一点:就是说服务端给客户端发数据之前,先计算一下给客户端要发多少数据,我先判断 len 一下,就 ok 了,先让客户端知道服务端发送过来的大小,比如说发过来的是5k大小,客户端接收到了这个5k大小以后,就知道需要接收多少次了,循环接收,直到5k数据全部接收完毕为止。
二、socket接收大数据
2.1、逻辑图

2.2、逻辑代码
1、客户端代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import socketclient = socket.socket()client.connect(("localhost",9999))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()) recevied_size = 0 #接收客户端发来数据的计算器 recevied_data = b'' #客户端每次发来内容的计数器 while recevied_size < int(cmd_res_size.decode()): #当接收的数据大小 小于 客户端发来的数据 cmd_res = client.recv(1024) recevied_size += len(cmd_res) #每次收到的服务端的数据有可能小于1024,所以必须用len判断 recevied_data += cmd_res else: print(recevied_data.decode("utf-8","ignore")) print("cmd res receive done ....",recevied_size)client.close() |
2、服务端代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import socket,osserver = socket.socket()server.bind(("localhost",9999))server.listen(5)while True: conn,addr = server.accept() print("new addr:",addr) while True: data = conn.recv(1024) if not data: print("客户端已断开") break print("执行指令:",data) cmd_res = os.popen(data.decode()).read() print("before send:",len(cmd_res)) if len(cmd_res) == 0: cmd_res = "cmd has no output...." conn.send( str(len(cmd_res.encode())).encode() ) #发送服务端发送给客户端数据的长度 conn.send(cmd_res.encode("utf-8")) #发送服务端的数据 print("send done")server.close() |
上面的代码解决了上面博客,客户端接收大数据出现的疑难杂症,问题表现,请查看:猛击这里 中的 socket接收大数据困惑。
三、中文字符的坑
3.1、客户端接收数据大小和实际大小不一致
说明:客户端在接收数据的大小会和实际数据带下不一样,感觉实际数据要比客户端接收的数据要大,这是为什么呢?我们先来看一下现象吧。
1、客户端代码改动如图:

2、服务端代码改动如图:

3、实现的效果图:

上面的两个数据应该一样的呀,为啥不一样呢?为啥之前的就能一样呢?
答:因为python用计算中文字符,按字符和字节算的话,长度的值是不一样的,一个 中文字符=3个字节 ,如图:

网络编程基础【day09】:socket接收大数据(五)的更多相关文章
- 【python】-- Socket接收大数据
Socket接收大数据 上一篇博客中的简单ssh实例,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区中,这样就会造成我们想要获取数据的完整 ...
- 从零开始学Python第八周:网络编程基础(socket)
Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Soc ...
- 网络编程 - socket接收大数据
通过socket,实现客户端发送命令,将服务端执行出的结果,反回到客户端,主要4个步骤:1.服务端返回数据: 2.服务端返回数据的大小: 3.客户端接收返回数据的大小: 4.客户端按返回数据大小接收数 ...
- 第1章 网络编程基础(2)——Socket编程原理
Socket编程原理 Socket是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制. 流socket(SOCK_STREAM):双向.有序.无重复.并且无记录边界 数据报Socket(SOC ...
- 网络编程基础之Socket套接字
一.Socket介绍 1.什么是socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族 ...
- python网络编程基础之socket粘包现象
粘包现象两种 登陆 #服务端import json import socket server=socket.socket()#创建socket对象 ip_port=('127.0.0.1',8001) ...
- 网络编程基础之Socket套接字简单应用
一.Socket套接字实现通信循环 所谓通信循环,简单理解就是客户端可以给服务端循环发送信息并获得反馈的过程. 1.基础版 通信循环的程序分为两部分,即两个python模块,分别为客户端.py和服务端 ...
- 网络编程基础之socket套接字编程实现同一IP下的信息传输
鲁照山 1.网络协议的5层模型,每层内容的整理 2.画图描述三次握手四次挥手,和C端S端的状态 3.写一个客户端,实现给服务端发送hello world 字符串, 写一个服务端,将客户端发送的数据变成 ...
- 网络编程 基础 基于socket的tcp和udp连接
网络开发的框架 C/S B/S 架构 程序都是bs架构的程序(b指浏览器,s指服务器) c(client)是客户端,s(server)是服务器 bs架构是cs架构的一种 未来的趋势, pc端bs架构, ...
随机推荐
- 第四十九天 mysql 索引 元类
一 昨日回顾 视图 触发器 事务 什么是事务 逻辑上的一组操作 要么都成功 要么都失败 如何使用 start transaction 开启事务 mysql 默认一条sql就是一个事务 pymysql默 ...
- CH2101 可达性统计(算竞进阶习题)
拓扑排序+状态压缩 考虑每一个点能够到达的所有点都是与该店相邻的点的后继节点,可知: 令f[u]表示u点可到达的节点个数,f[u]={u}与f[v](u, v)的并集 于是可以利用状态压缩,能够到达的 ...
- [ZJOI2009]函数 题解
题目链接:[ZJOI2009]函数 对于$n=1$的情况,直接输出$1$ 对于$n>1$的情况,由于我们可以将图上下反转,所以第$k$层的情况可以被转成第$n-k+1$层 规律自己打个表可以推出 ...
- 【XSY2665】没有上司的舞会 LCT DP
题目大意 有一棵树,最开始只有一个点.每次会往这棵树中加一个点,总共\(n\)次.输出每次加点后树的最大独立集大小. 强制在线. \(n\leq 300000\) 题解 显然是LCT. 那么要维护什么 ...
- Codeforces Round #453 (Div. 1) D. Weighting a Tree(构造)
题意 一个 \(n\) 个点 \(m\) 条边的无向连通图中每个点都有一个权值,现在要求给每条边定一个权值,满足每个点的权值等于所有相连的边权之和,权值可负. 题解 如果图是一棵树,那么方案就是唯一的 ...
- 【BZOJ3691】游行(网络流)
[BZOJ3691]游行(网络流) 题面 BZOJ 然而权限题. Description 每年春季,在某岛屿上都会举行游行活动. 在这个岛屿上有N个城市,M条连接着城市的有向道路. 你要安排英雄们的巡 ...
- rsync服务部署
构建rsync远程同步----------同步源----------------发起端-------------192.168.1.1 192.168.1.101.配置IP地址并保证互通2.确定备份源 ...
- mysql 单表卡死
由于单表数据量过大导致的更新操作处于卡死状态,无法打开也无法修改. 此时需要命令行模式连接数据库,注意点:此处连接需要相同的账号 1. $ SHOW PROCESSLIST; 2. $ kill 37 ...
- Permissions 0755 for '/home/lonecloud/.ssh/id_rsa' are too open.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! ...
- Anaconda For Linux (附C#交互式编程的引入)
汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Jupyter美化: https://www.cnblogs.com/dotnetcra ...