socket通信如何处理每次包长度不定问题
说起来,这是一个漫长的问题:
客户端和服务器通信的结构是:包头+数据长度+数据
客户端请求服务器发送200包数据。包头=request;长度=4(一个int),数据=200;
服务器在收到客户端的请求后,在while循环里面不停的send,直到够200包:包头=indicate 长度=XX,后面跟一大串数据;发完以后,再发一个结束的包:包头=end,长度-1,data=无效值。
在服务器端,在while循环里不停的recv:先recv包头,在recv长度。如果判断是数据,然后recv数据。如果判断是结束包,那么break出循环。
这个看似没有问题的程序,实际存在一个问题:
在客户端,recv包头和长度后,recv数据,可能出现数据并没有全部传过来的情况,比如recv长度后,得知后面的数据有15000字节。但是由于阻塞等原因,只传过来了7000字节。那么按照原来程序的逻辑,就会在下一次recv包头和长度时,将实际发送的剩下的8000字节当做新一包的包头,然后解包,这样就出现了错误。
我的处理办法是,如果recv数据时,实际收到的长度不等于发送数据长度,那么就搞一个小的while循环,在循环中把这一包收满(为了保证收满,可以sleep(10)),然后跳出来,继续收下一包,就解决了。
这个办法是很土,但是由于每包的长度不定,所以暂时只能想到这个办法解决。
socket通信如何处理每次包长度不定问题的更多相关文章
- python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)
8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...
- java之接口开发-初级篇-socket通信
socket通信实现util包类实现 public class SocketThread extends Thread { public void run() { while (true) { // ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- 网络编程 - socket通信/粘包/文件传输/udp - 总结
socket通信 1.简单的套接字通信 import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bin ...
- day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信
day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...
- TCP Socket通信详细过程
下面这篇文章是参考"骏马金龙"博客中 不可不知的socket和TCP连接过程 https://www.cnblogs.com/f-ck-need-u/p/7623252.html ...
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 网络编程:Http通信与Socket通信
http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note 网络编程:Http通信与Socket通信 ...
随机推荐
- python爬虫踩坑教程
我们的目标是爬取下面这个个网址上的2010~2018年的数据 http://stockdata.stock.hexun.com/zrbg/Plate.aspx?date=2015-12-31 获取我们 ...
- 使用bootstrap table 数据绑定
1.最近一直在用bootstrap table 这个前端框架做项目,下面是使用bootstrap table 的一些总结 这个使用.Net 中MVC做的: 2.这个是基本的boostrap table ...
- Jenkins忘记admin密码处理方法
1.先找到enkins/config.xml文件,并备份. 此文件位于Jenkins系统设置的主目录,根据自己的配置情况而定.我的位置如下 /data/temp/jenkins/config.xml2 ...
- MongoDB通过Shell 实现集合的日常归档
1.MongoDB数据归档的意义 和其他类型的数据库一样,归档对MongoDB同样重要.通过归档,可以保持集合中合适的数据量,对数据库的性能是一种保障,也就是大家常说的数据冷热分离. 同时,归档对数据 ...
- 和我一起学习爬虫之HTTP/HTTPS抓包工具--Fiddler
HTTP/HTTPS抓包工具--Fiddler Fiddler[ˈfɪdlə(r)] 1. HTTP代理神器Fiddler Fiddler是一款强大Web调试工具,它能记录所有客户端和服务器的HTTP ...
- windows创建域共享文件
windows创建域共享文件 windows常见的文件系统: FAT FAT32 NTFS NTFS的特点: 可以对单个文件或文件夹设置权限 支持更大的磁盘容量 支持加密和压缩 活动目录需要NTFS ...
- pytest进阶之html测试报告
前言 Pytest系列已经写了几篇文章了,也不知道对多少人有帮助,总之对于我自己来说该掌握的都已经掌握了,那么今天我们再来说说pytest如何生成一个完整的html测试报告,让你在吹牛逼的路上再多一份 ...
- python3 集合 操作方法
今天都是课, 就学这么点 不多说 睡觉睡觉!!! #!usr/bin/env/ python # -*- coding:utf-8 -*- # Author:XiaoFeng list = [1,2 ...
- Beyond Compare 3.3.8 build 16340 + Key
本文摘录自冰点社区:http://forum.z27315.com/topic/14746-beyond-compare-338-build-16340-key/ Download Beyond Co ...
- JQuery 常用的那些东西
CDN Google CDN Microsoft CDN CDNJS CDN jsDelivr CDN 选择器 jQuery 元素选择器和属性选择器允许您通过标签名.属性名或内容对 HTML 元素进行 ...