workerman接收数据长度

用的TCP协议


$worker->onMessage = function($connection, $data)
{
print_r("|".$data."|\n"); // 接收较长字符串时被截断 , 1440长度时截断
}
尝试设置:
TcpConnection::$maxPackageSize = 102400000;
TcpConnection::$defaultMaxSendBufferSize = 200*1024*1024;
$connection->maxSendBufferSize = 10240000;
均无效... 是我配置的地方不对吗?
已邀请:

walkor

赞同来自: blogdaren

TCP 2个特点,
1、分帧传输
2、数据无边界。
 
底层tcp数据是一帧一帧传输到服务端的,每一帧数据大小约为1400字节,所以每次onMessage里收到1400字节左右的数据是正常的。
 
由于特点2,无边界,所以操作系统没办法判断哪些帧是一个完整的数据包,也就没办法做到收到完整的数据包后出发onMessage。
 
由于以上特点才会有这么多的应用层通讯协议出现,http、websocket、ftp等等。应用层通讯协议的作用就是通过分析数据帧里的数据来判断这个数据包的大小,然后来判断当前收到的这些数据帧是否已经是一个完整的数据包,如果不完整会继续等待,如果完整则触发onMessage。
 
所以要收到完整的数据包需要增加一个应用层协议,参考手册
http://doc.workerman.net/protocols/why-protocols.html
 

blogdaren - 乐于分享的PHP码农【http://www.blogdaren.com】

赞同来自:

1、上面几个配置首先是无效的,而且 
TcpConnection::$maxPackageSize
指的是每个连接能够接收的最大包包长,这个是针对应用层协议而言的;
另外两个设置则是针对应用层发送缓冲区的设置,和你的需求更不相关了。
2、TCP协议接收包时默认读取的是65535个字节。

要回复问题请先登录注册