python粘包问题及socket套接字编程详解
作者:格格小丫头 时间:2021-03-25 05:58:46
粘包问题
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()
来源:https://www.cnblogs.com/geyatou322/p/11099366.html
标签:python,粘包,socket,套接字
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python爬虫番外篇之Cookie和Session详解
2022-02-09 18:56:44
![](https://img.aspxhome.com/file/2023/9/89209_0s.jpg)
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2023-11-19 12:10:26
python如何获取服务器硬件信息
2023-05-10 18:28:06
ajax xmlhttp getResponseHeader实例教程
2009-02-04 10:46:00
利用Python开发实现简单的记事本
2023-07-02 13:27:27
![](https://img.aspxhome.com/file/2023/4/59654_0s.png)
python time.strptime格式化实例详解
2022-03-25 19:13:02
Python实现二叉树前序、中序、后序及层次遍历示例代码
2023-12-02 00:36:40
python如何使用opencv提取光流详解
2023-06-19 19:02:19
![](https://img.aspxhome.com/file/2023/5/112605_0s.png)
python实现的简单文本类游戏实例
2022-10-22 02:32:51
解决python 虚拟环境删除包无法加载的问题
2023-09-15 14:43:57
JavaScript实现带自动提示的文本框效果代码
2011-02-05 11:13:00
Python Pygame实现落球游戏详解
2021-06-23 00:54:38
![](https://img.aspxhome.com/file/2023/0/94140_0s.png)
selenium获取当前页面的url、源码、title的方法
2022-10-01 18:34:53
![](https://img.aspxhome.com/file/2023/5/123465_0s.gif)
发一段鼠标掠过表格行颜色改变的代码
2010-07-02 12:59:00
一文了解Python并发编程的工程实现方法
2023-12-26 13:54:36
Python爬虫中Selenium实现文件上传
2023-03-27 22:00:26
![](https://img.aspxhome.com/file/2023/7/76957_0s.png)
python 队列基本定义与使用方法【初始化、赋值、判断等】
2023-08-13 06:34:46
![](https://img.aspxhome.com/file/2023/6/61476_0s.png)
Python的argparse库使用详解
2023-06-13 11:27:36
php中用socket模拟http中post或者get提交数据的示例代码
2023-11-19 00:45:21
TensorFlow中权重的随机初始化的方法
2023-01-02 06:11:32