首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
WebSocketClient丢消息问题:服务端连发两条消息,客服端只能收到一条
swoole版本1.8.13稳定版,基本就是swoole-src-1.8.13-stable/examples/websocket/下的例子,server会在每收到消息回复一个message,现在我的测试案例是: 1、客户端发一条消息,然后收一条消息,正常 {{{ $client = new WebSocketClient($host, $prot); $client->connect(); for ($i = 0; $i < $count; $i++) { $client->send("hello swoole, number:" . $i); $data = @$client->recv(); echo $data . " size:" . strlen($data) . PHP_EOL; } }}} 执行: php client.php -c 1 -n 2 输出: {{{ 1BBBBBBBBBBBBBBBBBBBB size:21 1BBBBBBBBBBBBBBBB size:17 }}} 2、客户端发两条消息,然后希望recv两次收到两条消息,结果只能收到一条: {{{ $client = new WebSocketClient($host, $prot); $client->connect(); for ($i = 0; $i < $count; $i++) { $client->send("hello swoole, number:" . $i); } for($i = 0;$i < $count; $i++) { $data = @$client->recv(); echo $data . " size:" . strlen($data) . PHP_EOL; } }}} 执行: php client.php -c 1 -n 2 输出: {{{ 1BBBBBBBBBBBBBB size:15 Error: size:0 }}} **第二条revc超时,这样就丢了一条消息!**
发布于8年前 · 3 次浏览 · 来自
提问
w
www
swoole版本1.8.13稳定版,基本就是swoole-src-1.8.13-stable/examples/websocket/下的例子,server会在每收到消息回复一个message,现在我的测试案例是: 1、客户端发一条消息,然后收一条消息,正常 {{{ $client = new WebSocketClient($host, $prot); $client->connect(); for ($i = 0; $i < $count; $i++) { $client->send("hello swoole, number:" . $i); $data = @$client->recv(); echo $data . " size:" . strlen($data) . PHP_EOL; } }}} 执行: php client.php -c 1 -n 2 输出: {{{ 1BBBBBBBBBBBBBBBBBBBB size:21 1BBBBBBBBBBBBBBBB size:17 }}} 2、客户端发两条消息,然后希望recv两次收到两条消息,结果只能收到一条: {{{ $client = new WebSocketClient($host, $prot); $client->connect(); for ($i = 0; $i < $count; $i++) { $client->send("hello swoole, number:" . $i); } for($i = 0;$i < $count; $i++) { $data = @$client->recv(); echo $data . " size:" . strlen($data) . PHP_EOL; } }}} 执行: php client.php -c 1 -n 2 输出: {{{ 1BBBBBBBBBBBBBB size:15 Error: size:0 }}} **第二条revc超时,这样就丢了一条消息!**
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2018-03-31
F
Forever
无法重现你的问题,WebSocket->recv 这里存在一个BUG,它返回的不是字符串,是一个对象,你需要修改一下代码。
赞
0
回复
2018-03-31
邸
邸广照
谢谢天峰花时间 recv函数的问题我修改了。 测试的问题是:如果在client.php里面连续send两次,然后recv两次去接收服务端响应的消息,会在第一次recv的时候收到服务端对第一个消息的回复。第二个recv会超时没有收到任何消息。服务端日志都是正常的。(客户端和服务端都在一个机器) 客服端核心代码: $client = new WebSocketClient($host, $prot); $client->connect(); {
赞
0
回复
2018-04-01
C
Ciel°
检查服务器逻辑,是否阻塞了。使用strace, tcpdump等工具跟踪进程
赞
0
回复
2018-04-02
҉
҉ Jason ҉
同步阻塞模式建议使用Swoole/Framework中自带的WebSocket客户端。异步模式建议直接使用`Swoole\Http\Client`作为WebSocket客户端。
赞
0
回复
2018-04-03
°
°
问题已经定位:实质是swoole扩展下的WebSocketClient只是一个简单的demo,对tcp协议可能出现的小包合并一次返回的情况没有处理。请参考rango的文章:http://rango.swoole.com/archives/464 。另外:使用Swoole/Framework的WebSocket客户端已经没有问题了,谢谢rango的耐心解答。
赞
0
回复