php调用stream_get_contents从tcp套接字中获取数据,有时能够调用一次就能获取全部,有时获取为空需要循环查询
<?php
$socket = stream_socket_server('tcp://127.0.0.1:8888',$errno,$errstr,STREAM_SERVER_BIND|STREAM_SERVER_LISTEN);
if(!$socket){
die('failed to create a socket');
}
stream_set_blocking($socket,false);
//监听新连接
$ev = new EvIo($socket,Ev::READ,function ($watcher) use($socket,$clients){
$client = stream_socket_accept($socket);
stream_set_blocking($client,false);
//监听客户端信息
$e = new EvIo($client,Ev::READ|Ev::WRITE,function ($watcher) use($client){
$data = stream_get_contents($client);
echo $data;//有时输出为空,有时完整输出
/* do{
$data = stream_get_contents($client);
}while($data==false);
发现有时一次就能获取,有时需要重复调用知道获取到
*/
fclose($client);
$watcher->stop();
});
Ev::run();
});
Ev::run();
请问是什么原因造成的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你要知道TCP是流式协议,没有消息边界的,UDP是有消息边界的,所以你发送端的数据,到接收端这边,可能需要一次,或者两次,或者一次把两次发送的数据都接收了
你可以想象你是在接收水流,所以你是不知道它那里结束的
可以搜索TCP粘包问题,一般解决方案有: