python粘包问题及socket套接字编程详解


Posted in Python onJune 29, 2019

粘包问题

TCP协议在传输过程中会出现数据粘包问题

讲一下TCP和UDP的区别,都是传数据的协议,没有好坏之说,只是不同的应用需求可能会更好选择哪一个协议

TCP:适合传输数量大 ,需要建立连接,会出现粘包问题,粘包问题可以解决,确定传入的长度,接收同样长度就可以保证一次性传输完

UDP: 适合传输数据量小,没有粘包,不需要连接,一次性传输,下一次就是新的数据,弊端就是数据丢失,不安全

QQ是用什么协议呢?按理应该可以用UDP协议,但是实际用的是TCP协议,这是历史遗留问题,可还记得我们输入QQ一次性输入的内容字数有限制吗?就是规定了发送与接收的数据长度是一样的.

形成粘包的原因

1.两个数据非常小,然后间隔时间又短

2.数据太大,一次取不完,下一次还会取这个大数据

解决粘包问题

==在传数据之前,传一个数据的大小,数据的大小必须得定长==

# TCP 解决粘包问题 附带处理了一下
import socket
import struct
import subprocess
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8000))
server.listen(5)
print('start...')
# 连接循环
while True:
conn, client_address = server.accept()
print(client_address)
# 通信循环
while True:
try:
cmd = conn.recv(1024)
print(cmd)
pipeline = subprocess.Popen(cmd.decode('utf8'),
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
stdout = pipeline.stdout.read()
stderr = pipeline.stderr.read()
count_len = len(stdout) + len(stderr)
guding_bytes = struct.pack('i', count_len)
conn.send(guding_bytes) # 4
conn.send(stderr + stdout)
except ConnectionResetError: # 连接循环时出现的中断
break
conn.close()
# 客户端
mport struct
from socket import *
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1', 8000))
while True:
# cmd = input('please enter your cmd you want:')
cmd = 'dir'
client.send(cmd.encode('utf8'))
guding_bytes = client.recv(4)
count_len = struct.unpack('i', guding_bytes)[0]
data = client.recv(count_len)
print(data.decode('gbk'))

基于UDP协议的socket套接字编程

UDP 无连接

# UDP服务端
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8000))
print('start...')
while True:
data, client_addr = server.recvfrom(1024)
print(client_addr)
print(data)
server.sendto(data.upper(), client_addr)
# UDP客户端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
msg = input('please enter your msg:')
client.sendto(msg.encode('utf8'), ('127.0.0.1', 8000))
data = client.recvfrom(1024)
print(data)

和TCP是差不多的,调用的功能是一样的,只是方法名的具体表示方法不一样,因为UDP无连接,UDP的sendto和TCP的send ,就是UDP的sendto要直接指到地址的

基于socketserver实现并发的socket套接字编程

让服务端同时和多个客户端进行连接,以前我们写的是一个警局有五部电话只有一个人,现在写的五部电话五个人

# 同一时刻有多个人在接听
import socketserver
import subprocess 
import struct
class MyHandler(socketserver.BaseRequestHandler):
# 通信循环
def handle(self):
while True:
try:
cmd = self.request.recv(1024)
print(cmd)
pipeline = subprocess.Popen(cmd.decode('utf8'),
shell = True,
stderr = subprocess.PIPE,
stdout = subprocess.PIPE)
stdout = pipeline.stdout.read()
stderr = pipeline.stderr.read()
count_len = len(stderr) + len(stdout)
guding_bytes = struct.pack('i', count_len)
self.request.send(guding_bytes) # 4
self.request.send(stderr + stdout)
except ConnectionResetError:
break
# 使用socketserver的连接循环(并发),但是使用了自己的通信循环
# myhandler = MyHandler()
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8000), MyHandler, bind_and_activate=True)
print('start...')
server.serve_forever()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解决csv.writer写入文件有多余的空行问题
Jul 06 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
详解django自定义中间件处理
Nov 21 Python
PyQt5组件读取参数的实例
Jun 25 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
pygame实现俄罗斯方块游戏(对战篇1)
Oct 29 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
Nov 19 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
Python first-order-model实现让照片动起来
Jun 25 Python
python 基于TCP协议的套接字编程详解
Jun 29 #Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 #Python
简单了解Python matplotlib线的属性
Jun 29 #Python
Jacobi迭代算法的Python实现详解
Jun 29 #Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 #Python
python异步实现定时任务和周期任务的方法
Jun 29 #Python
python循环定时中断执行某一段程序的实例
Jun 29 #Python
You might like
用PHP制作静态网站的模板框架
2006/10/09 PHP
用header 发送cookie的php代码
2007/03/16 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
vue按需加载实例详解
2019/09/06 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
python获取糗百图片代码实例
2013/12/18 Python
用实例分析Python中method的参数传递过程
2015/04/02 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Python IDLE清空窗口的实例
2018/06/25 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
python高阶函数map()和reduce()实例解析
2020/03/16 Python
电子技术专业中专生的自我评价
2013/12/17 职场文书
奶茶专卖店创业计划书
2014/01/18 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
网上商城创业计划书范文
2014/01/31 职场文书
彩色的非洲教学反思
2014/02/18 职场文书
小时代观后感
2015/06/10 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书