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学生信息管理系统(完整版)
Apr 05 Python
在Mac上删除自己安装的Python方法
Oct 29 Python
Python数据报表之Excel操作模块用法分析
Mar 11 Python
python设置环境变量的原因和方法
Jun 24 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
python绘制随机网络图形示例
Nov 21 Python
Python requests模块session代码实例
Apr 14 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
python实现猜数游戏(保存游戏记录)
Jun 22 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 Python
python装饰器代码深入讲解
Mar 01 Python
Python集合set()使用的方法详解
Mar 18 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 安装方法
2006/10/09 PHP
Yii分页用法实例详解
2014/12/04 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
window.open的功能全解析
2006/10/10 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
this在vue和小程序中的使用详解
2019/01/28 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
python练习程序批量修改文件名
2014/01/16 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
python 实现线程之间的通信示例
2020/02/14 Python
关于python 跨域处理方式详解
2020/03/28 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
降低python版本的操作方法
2020/09/11 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
暑期社会实践方案
2014/02/05 职场文书
大学生新学期计划书
2014/04/28 职场文书
部门2014年度工作总结
2014/11/12 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫