TCP协议的粘包现象和解决方法
# 粘包现象
# server
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8005))
sk.listen()
conn, addr = sk.accept()
conn.send(b'123')
conn.send(b'123')
# client
import time
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 8005))
time.sleep(5)
msg1 = sk.recv(1024).decode('utf-8')
msg2 = sk.recv(1024).decode('utf-8')
print(msg1)
print(msg2)
# 客户端接收到的信息,两条黏在了一起
# 123123
#
# 这就是粘包现象
解决方法:
# 利用struct模块
# server
import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8005))
sk.listen()
def func(msg):
msg = msg
len_msg = len(msg)
struct_msg = struct.pack('i', len_msg)
conn.send(struct_msg)
conn.send(msg)
conn, addr = sk.accept()
msg1 = '这是第一条信息'.encode('utf-8')
msg2 = '这是第二条信息'.encode('utf-8')
func(msg1)
func(msg2)
# client
import struct
import socket
import time
sk = socket.socket()
sk.connect(('127.0.0.1', 8005))
time.sleep(10)
def func(sk):
struct_msg = sk.recv(4)
struct_msg = struct.unpack('i', struct_msg)[0]
msg = sk.recv(int(struct_msg)).decode('utf-8')
return msg
print(func(sk))
print(func(sk))
TCP协议的粘包现象和解决方法的更多相关文章
- 基于tcp协议下粘包现象和解决方案,socketserver
一.缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送 ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- python socket的应用 以及tcp中的粘包现象
1,socket套接字 一个接口模块,在tcp/udp协议之间的传输接口,将其影藏在socket之后,用户看到的是socket让其看到的. 在tcp中当做server和client的主要模块运用 #s ...
- 网络编程之tcp协议以及粘包问题
网络编程tcp协议与socket以及单例的补充 一.单例补充 实现单列的几种方式 #方式一:classmethod # class Singleton: # # __instance = None # ...
- 为什么 TCP 协议有粘包问题
为什么 TCP 协议有粘包问题 这部分转载自draveness博客. TCP/IP 协议簇建立了互联网中通信协议的概念模型,该协议簇中的两个主要协议就是 TCP 和 IP 协议.TCP/ IP 协议簇 ...
- python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议
socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...
- 基于tcp协议的粘包问题(subprocess、struct)
要点: 报头 固定长度bytes类型 1.粘包现象 粘包就是在获取数据时,出现数据的内容不是本应该接收的数据,如:对方第一次发送hello,第二次发送world,我放接收时,应该收两次,一次是hel ...
- socket粘包现象加解决办法
socket粘包现象分析与解决方案 简单远程执行命令程序开发(内容回顾) res = subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=su ...
- TCP协议的粘包问题(八)
一.什么是粘包 在socket缓冲区和数据的传递过程介绍中,可以看到数据的接收和发送是无关的,read()/recv() 函数不管数据发送了多少次,都会尽可能多的接收数据.也就是说,read()/re ...
随机推荐
- Presto部署指南
1.Presto简介说明 Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节. Presto的设计和编写完全是为了解决像Facebook这样规模的商业数据仓库 ...
- (Java多线程系列四)停止线程
停止线程 停止线程的思路 ①使用退出标志,使线程正常退出,也就是当run()方法结束后线程终止. class Thread01 extends Thread { // volatile关键字解决线程的 ...
- jQuery_复制操作
复制操作代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- jmxtrans + OpenTSDB + granafa 监控套件使用手册
需求说明 编写背景 此手册的基础在于对<jmxtrans + influxdb + granafa 监控套件使用手册>的熟悉和使用.本手册仅介绍以下几项: OpenTSDB 的配置安装 对 ...
- 使用ElementUI创建项目
从 0 开始搭建 element 项目 第一步,安装 Nodejs/NPM https://nodejs.org/zh-cn/download/ 下载安装即可! 第二步,安装 vue-cli 打开 c ...
- Java多线程核心知识
多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关 ...
- MessageWebSocket
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; usi ...
- tensorflow实现迁移学习
此例程出自<TensorFlow实战Google深度学习框架>6.5.2小节 卷积神经网络迁移学习. 数据集来自http://download.tensorflow.org/example ...
- java导入导出下载Excel,xls文件(带下拉框)
/** * 导入excel文件 * 2014-7-23 * @return */ @RequiresPermissions("plug:product:caiwu:upload") ...
- IFB
本文翻译自Linux官方IFB文档 IFB(中介功能块设备)是IMQ(中介队列设备)的继任者,IMQ从来没有被集成过,IFB拥有IMQ的优点,在SMP上更加清晰明了,并且代码量缩减了非常多,旧的中介设 ...