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 相关文章推荐
python字典多条件排序方法实例
Jun 30 Python
Python+微信接口实现运维报警
Aug 27 Python
python 容器总结整理
Apr 04 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
python判断是空的实例分享
Jul 06 Python
用Python实现职工信息管理系统
Dec 30 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
May 27 Python
用Python进行栅格数据的分区统计和批量提取
May 27 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
js实现文字截断功能
2016/09/14 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
python散点图实例之随机漫步
2018/08/27 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
python3字符串操作总结
2019/07/24 Python
python反转列表的三种方式解析
2019/11/08 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
护士专业推荐信
2013/11/02 职场文书
绩效专员岗位职责
2013/12/02 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
休学证明范本
2015/06/19 职场文书
2016母亲节感恩话语
2015/12/09 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript