WebsocketClient连接一段时间后不知原因onClose,而且reConnect失败

WebsocketClient开始可以正常连接,每三十秒发送数据,可正常接收返回数据。过几小时-十几小时不等,之后会onClose(不知道啥原因),我在里面运行reConnect,有时可以重连成功,有时失败。
从没有触发过onError。
报错:
Sec-WebSocket-Accpet not match.

qwefsd1234235.png

而且一大串数据输出之后还有
error package. package_length=false

 
在网上搜了半天没找到相关内容,还请大佬指点
 
----------------------------------------------------------------------------
服务端用的GatewayWorker
下面是客户端的启动文件
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use \Workerman\Lib\Timer;

require_once __DIR__ . '/Workerman/Autoloader.php';

date_default_timezone_set("PRC");

$worker = new Worker();

$worker->onWorkerStart = function($worker){

$reConnentTimer = null;
$file = null;

$conn = new AsyncTcpConnection('ws://39.105.170.46:8282');

$conn->onConnect = function($conn) {
$conn->send('send onConnect');
Timer::add(30, function() use ($conn)
{
$conn->send(date("Y-m-d H:i:s"));
});
echo "run Timer::add( send message )\n";
global $file;
if (!isset($file)) {
$file = fopen('stdout.log','a');
}
fwrite($file, "run Timer::add( send message )"."\n");
};

$conn->onMessage = function($conn, $data) {
echo $data;
global $file;
if (!isset($file)) {
$file = fopen('stdout.log','a');
}
fwrite($file, $data);
global $reConnentTimer;
if ($reConnentTimer) {
Timer::del($reConnentTimer);
$reConnentTimer = null;
echo "run Timer::del( reConnect )\n";
global $file;
if (!isset($file)) {
$file = fopen('stdout.log','a');
}
fwrite($file, "run Timer::del( reConnect )"."\n");
}
};

$conn->onClose = function($conn) {
echo "run onClose()";
global $reConnentTimer;
global $file;
if ($reConnentTimer == null) {
$reConnentTimer = Timer::add(3, function() use ($conn,$file)
{
$conn->reConnect(0);
echo "run reConnect()\n";
if (!isset($file)) {
$file = fopen('stdout.log','a');
}
fwrite($file, "run reConnect()"."\n");
});
echo "run Timer::add( reConnect )\n";
global $file;
if (!isset($file)) {
$file = fopen('stdout.log','a');
}
fwrite($file, "run Timer::add( reConnect )"."\n");
}
};

$conn->onError = function($conn, $code, $msg) {
echo "error $code $msg\n";
global $file;
if (!isset($file)) {
$file = fopen('stdout.log','a');
}
fwrite($file, "error $code $msg"."\n");
};

$conn->connect();
};

Worker::runAll();
已邀请:

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

赞同来自:

1. 保证已经成功设置好了心跳。
2. 客户端onClose方法中关于Timer部分的代码整体替换为:
$conn->onClose = function($conn) {
$conn->reconnect(3);
}

zhyt0520

赞同来自:

@walkor
我更新完workerman,不再报错了
Sec-WebSocket-Accpet not match.
但是重连连不上的问题仍然没解决,客户端这边是下面截图的样子,服务端那边也没有错误信息
snipaste_20190213_085545.png
 
多次测试发现,发生 onClose 并且 reConnect 连不上的情况都出现在早晨六点五十多的时候
而且这个客户端连不上的时候,我再开个新的客户端去连服务器也连不上,把出问题这个关掉之后,就可以再开多个客户端重新连接服务器了
 
还麻烦大佬给看看问题在哪,或者指点我一下监控进程的思路,发现reConnect失败之后如何关掉当前进程并重新开一个新的

walkor

赞同来自:

 
$conn->onClose = function($conn) {
$conn->reconnect(3);
};
重连是这样重连的,自身已经有定时逻辑,不能再放到定时器里。

要回复问题请先登录注册