ws客户端
AsyncTcpConnection断线,在onClose时候,通过$connection->reConnect(1),on connect触发: Sec-WebSocket-Accept not found。
目前糟糕的解决方案是:onClose时候,reload -g 重启进程。
期待更好的解答。
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/Workerman/Autoloader.php';
$worker = new Worker();
// 进程启动时
$worker->onWorkerStart = function()
{
// 以websocket协议连接远程websocket服务器
$ws_connection = new AsyncTcpConnection("ws://echo.websocket.org:80");
// 连上后发送hello字符串
$ws_connection->onConnect = function($connection){
for($i=0;$i<100;$i++) {
$connection->send('hello');
}
};
// 远程websocket服务器发来消息时
$ws_connection->onMessage = function($connection, $data){
echo "recv: $data\n";
};
// 连接上发生错误时,一般是连接远程websocket服务器失败错误
$ws_connection->onError = function($connection, $code, $msg){
echo "error: $msg\n";
};
// 当连接远程websocket服务器的连接断开时
$ws_connection->onClose = function($connection){
echo "connection closed\n";
$connection->reConnect(1); //**_首次实例化connect无问题,重连触发==Sec-WebSocket-Accept not found.**_
};
// 设置好以上各种回调后,执行连接操作
$ws_connection->connect();
};
Worker::runAll();
onConnect 的时候,WebSocket 握手尚未完成,不要在这里发送数据。应用层的通信应该在 onWebSocketConnect 之后才能开始。
把workerman作为Websocket客户端,AsyncTcpConnection可以让Workerman作为客户端向远程服务端发起异步连接,并通过send接口和onMessage回调异步发送和处理连接上的数据。针对您所说的,对比官方示例http://doc3.workerman.net/worker-development/__construct.html;然后自测了一下,问题还是存在。
测试了下这个脚本,没发现所说的Sec-WebSocket-Accept not found问题
我在onConnect里面,调用循环订阅多个ch, 有多个$connection->send(),难道是这个影响了?
脚本已经更新
更新的脚本出现很多未定义变量,脚本请先自行测试下能否重现你的问题再贴出来吧,这样大家都节省时间,也是对其它想帮助你的人的一种尊重。
@1:里面其实就是一个循环,订阅了N多频道