TCP和UDP想必是通讯中用的最多的协议了,具体的协议规则就不介绍了,在此只是记录一下在项目中遇到的一些问题,文字没有怎么组织,基本上是想到哪写到哪,莫怪.......
tcp问题一:心跳包
因为tcp的长连接问题,需要保活连接,常规的做法就是发送心跳包,通过往服务器一端发送一小段数据包,接收端可以不处理。考虑到这种需求,mSocket.sendUrgentData(0xff);这个方法可能会很合适,因为接受端接受到这种消息会自动忽略,不需要自己着手处理。在测试中,发现通过该方法由手机端发送心跳到pc上,pc为xp系统tcp连接正常,不会断线,而在win7系统时,tcp连接会在80s准时断开,虽然有重连机制,但是频繁的重连还是会影响性能。经过一段时间的排查,发现原因是在win7上,发送sendUrgentData该数据最多只能发送16次,而我的心跳包是5s发送一次,正好是80s。在win7上发送sendUrgentData数据16次会造成网络拥塞,造成连接中断。
tcp问题二:消息沾包
在移动端接收pc发送的tcp消息时发现会有两个甚至多个数据沾包的情况,造成两个消息粘连在一起,接收端解析消息时发生错误,并且这种情况只是在网路状况较差时发生。在TCP中因为三次握手原理,发生数据会接收ack的反馈,如果频繁的发生的小数据消息,会造成网络的拥塞,影响性能,因此为了防止网络中频繁的有小数据发生,tcp底层会启用nagle算法,每个tcp套接字都有一个缓冲区,每次发送其实都是从这个缓冲区中取数据发送,只有当数据包的大小达到套接字的缓冲区大小才会发送,在项目中由于我发送的是很小的字符串消息,它会等待下一个消息到达一定大小一起发送,这个tcp套接字缓冲区大小由系统内核缓冲区大小决定,这也就造成了消息沾连在一起的情况。解决的办法有以下几种:一,连续发送多个消息时,每个消息间隔40ms发送,tcp发送消息会有两个前提,一个是数据大小达到缓冲区大小马上发送,再者就是数据没有达到缓冲区大小,但是40ms还没有数据进入缓冲区,此时也会发送(有些说法是200ms,但经过测试在linux系统只有40ms,Android内核属于linux,因此只需在发送消息时间隔40ms);二,设置tcp无延迟,也就是不启用nagle算法,如果不设置是会默认开启,不启用的方法也很简单,调用mSocket.setTcpNoDelay(true);即可。但其实这种解决办法在需要高效率的网络通讯其实是不适用的,因为你可能无法忍受每次发送消息都得有40ms的延迟,而不启用nagle算法,频繁的发送小数据,又会造成网络拥塞,同样是会严重影响通讯性能的,所以在网络编程时最好避免这种多次发送,在接收的模式,应该保持“一发一收”的模式。
分享到:
相关推荐
TCP通信心跳包源码C语言实现,基于Linux平台写的,可以整合到自己的代码中去。
心跳包的发送,通常有两种技术 方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,...
Java心跳包功能的实现,tcp协议的,包含客户端和服务端
让初学者更容易理解心跳包是怎么回事,客户端和服务端是如何处理心跳包的
基于MFC的TCP心跳检测包,一款最基本的心跳检测包程序,里面的IP地址是写死的,可以在代码里修改,还是很方便的
c#写tcpListener;Android写tcpClient 具有心跳包,长连接,自动重连,发送失败自动重发等功能 电脑与Android需要同属一个局域网 tcpListener设计成只能与一...tcpClient具有重连,长连接,与tcpListener进行心跳包通讯
tcp同步连接发消息心跳检测,只在本机测试,大神勿喷
Android下利用socket进行tcp通信,同时发送心跳包保证tcp连接不掉线
很多人在写Socket的时候会遇到心跳包响应机制跟主线程消息传输机制如何规避而互不影响,本Demo就解决了此问题,而且简单易懂,都有备注,欢迎下载学习之用。
心跳包 -->优化算法的心跳包,采用udp协议进行数据通讯,检测手段及时有效,有问题请与我联系 qq :564878494
将资料client.c文件的IP地址,修改成虚拟机当前环境下的IP地址即可实现,开发板与虚拟机之间的信息交互
一款简单的TCP互相发送消息的程序,子进程和父进程可以互相发送或接受消息。
winform的socket通信中连接是否正常,最好通过心跳包来确定,本程序就是一个简单的心跳包实例,简单、易懂~
TCP发包工具,客户端windows开发的,可以进行同步短连接发包,方便调试通信报文
vs2005环境下,使用tcp通信协议实现的“心跳程序”。
tcp长连接,与服务器端保持长连接,发送心跳包。保持连接。
linux2.6_TCP包发送流程.pdf
代码调试成功,适用于Linux环境,可实现服务器与客户端定时交互,判断网络是否掉线,定时间隔可修改客户端itemval相关参数
场景如下:有一个功能,比如排行榜,这个房间的排行榜发生变化,要推送变化消息到房间。 这时,如果房间里送礼物很频繁,比如1秒 有10条送礼记录,排行榜发生了10次变化。 但是1秒推10条消息显然是2B的,要加一个...
TCP UDP 发包工具,带图形界面,win7 win8 win10可用 ok