python 网络编程 缓冲和粘包
tcp:属于长连接,与一个客户端进行连接了以后,其他的客户端要等待,要连接另外一个,必须优雅的断开前面这个客户端的连接. 允许地址重用:在bind IP地址和端口之前加上,# server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 允许(IP地址和端口)地址重用 缓冲区
输入缓冲区 #recv
输出缓冲区 #send 粘包(tcp的两种粘包现象)
1 连续发送小的数据,并且每次发送之间的时间间隔很短(输出缓冲区:两个消息在缓冲区黏在一起了)
原因是TCP为了传输效率,做了一个优化算法(Nagle),减少连续的小包发送(因为每个消息被包裹以后,都会有两个过程:1 组包 2拆包) 2 第一次服务端发送的数据比我客户端设置的一次接收消息的大小要大,那么接收不完,第二次再接收的时候,就会将第一次剩余的消息接收到 粘包的根本原因是因为:双方不知道对方发送消息的大小 解决方案一:
发送消息之前,先计算要发送消息的长度,然后先将消息长度发送过去,对方给你回一个确认收到长度的信息,然后根据接收到的消息长度来修改自己一次接收消息的大小
这个过程多了一次交互
代码:
服务端
import socket
import subprocess server = socket.socket()
ip_port = ('192.168.15.142',8001)
server.bind(ip_port)
server.listen()
conn,addr = server.accept()
while 1:
#来自客户端的指令
print('等待接受信息。。。')
from_client_cmd = conn.recv(1024).decode('utf-8')
print(from_client_cmd)
sub_obj = subprocess.Popen(
from_client_cmd, #客户端的指令
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
) #接受到的返回信息是bytes类型的,并且windows系统的默认编码为gbk
server_cmd_msg = sub_obj.stdout.read()
# server_cmd_err = sub_obj.stderr.read().decode('gbk')
cmd_msg_len = str(len(server_cmd_msg))
print('指令返回的正确信息的长度>>>',cmd_msg_len)
# print('指令返回的正确信息>>>',server_cmd_msg)
# print('指令返回的错误信息...',server_cmd_err) conn.send(cmd_msg_len.encode('gbk')) from_client_ack = conn.recv(1024).decode('utf-8')
print('from_client_ack',from_client_ack)
if from_client_ack == 'ok': conn.send(server_cmd_msg)
else:
continue
客户端
import socket
client = socket.socket()
server_ip_port = ('192.168.15.142',8001)
client.connect(server_ip_port)
while 1:
msg = input('请输入要执行的指令>>>')
client.send(msg.encode('utf-8'))
#先接收服务端要发送给我的信息的长度
from_server_msglen = int(client.recv(1024).decode('gbk'))
print('..........',from_server_msglen)
#给服务端回应一个收到了你的信息长度的确认信息
client.send('ok'.encode('utf-8')) #拿到信息长度后,将信息长度作为参数给了recv,recv就按照这个长度大小来接受服务端后面要给我发送的数据
from_server_stdout = client.recv(from_server_msglen).decode('gbk') print('收到的正确信息:', from_server_stdout) # from_server_error = client.recv(1024).decode('utf-8')
# print('收到的错误信息:',from_server_error)
python 网络编程 缓冲和粘包的更多相关文章
- (网络编程)基于tcp(粘包问题) udp协议的套接字通信
import socket 1.通信套接字(1人1句)服务端和1个客户端 2.通信循环(1人多句)服务端和1个客户端 3.通信循环(多人(串行)多句)多个客户端(服务端服务死:1个客户端---&g ...
- 网络编程基础之粘包现象与UDP协议
一.粘包现象原理分析 1.我们先来看几行代码,从现象来分析: 测试程序分为两部分,分别是服务端和客户端 服务端.py #!/usr/bin/env python3 #-*- coding:utf-8 ...
- UNIX网络编程——Socket/TCP粘包、多包和少包, 断包
为什么TCP 会粘包 前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整.为什么会这样吗,我们用mina这样通信框架,还会出现这种问题? TCP(transport cont ...
- 网络编程 - socket通信/粘包/文件传输/udp - 总结
socket通信 1.简单的套接字通信 import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bin ...
- 网络编程基础:粘包现象、基于UDP协议的套接字
粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...
- 第九章:Python の 网络编程基础(一)
本課主題 何为TCP/IP协议 初认识什么是网络编程 网络编程中的 "粘包" 自定义 MySocket 类 本周作业 何为TCP/IP 协议 TCP/IP协议是主机接入互网以及接入 ...
- Python网络编程04 /recv工作原理、展示收发问题、粘包现象
Python网络编程04 /recv工作原理.展示收发问题.粘包现象 目录 Python网络编程04 /recv工作原理.展示收发问题.粘包现象 1. recv工作原理 2. 展示收发问题示例 发多次 ...
- Python网络编程,粘包、分包问题的解决
tcp编程中的粘包.分包问题的解决: 参考:https://blog.csdn.net/yannanxiu/article/details/52096465 服务端: #!/bin/env pytho ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
随机推荐
- python中序列化模块json和pickle
json模块:json是第三方包,不是系统内置模块,以字符串序列 常用操作有: json.dumps() # 将变量序列化,即将功能性字符转化为字符串 例: >>> import j ...
- SQLI DUMB SERIES-8
(1)在id后加单引号.无回显,加双引号跟正常输入是一样的回显,既然不会回显出错信息,只能进行盲注. (2)盲注的方法同less5
- Java+opencv实现人脸检测
版本 Java1.8 opencv3.4 代码: import java.awt.Graphics; import java.awt.image.BufferedImage; import javax ...
- Python基础-socketserver
ocketserver通讯模块实现并发操作,基于select.epoll.socket.多线程,实现的正真多线程多并发 socketserver通讯模块底层调用的socket模块,只是它作了处理基于l ...
- [笔记]_ELVE_正则表达式
本文章转载至简书技匠,简书签约作者,技匠,以上内容欢迎大家分享到朋友圈/微博等. 正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑. ...
- centos7使用snmp
一.安装snmp net-snmp :服务端 net-snmp-utils:客户端工具集 二.启动 systemctl start snmpd 三.修改配置文件(完整的配置文件如下) com ...
- 游戏数据分析中“次日留存率”与“游戏生命周期第N天上线率”的SAS实现
在游戏行业,次日留存率是个很重要的指标,对于评价一款游戏的优劣具有很重要的参考价值. 下面先看以下相关的定义: 用户留存:统计时间区间内,新登用户在随后不同时期的登录使用情况. 日次留存率:日新登用户 ...
- C# Interview Question 1
What is C#? What's the feature of C# language? Answer:
- 【浅色】最强Win7 x64评测
[浅色]最强Win7 x64评测 [浅色]最强Win7 x86 & x64 | WINOS https://www.winos.me/archives/789.htmlESD671MB,安装后 ...
- keil5 MDK warning:registered ARM compiler version not found in path
重装 打开keil5弹出窗口: warning:registered ARM compiler version not found in path... 解决: 增加系统环境变量 ARMCC5LIB ...