国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

WebsocketClient連接一段時間后不知原因onClose,而且reConnect失敗

zhyt0520

WebsocketClient開始可以正常連接,每三十秒發(fā)送數(shù)據(jù),可正常接收返回數(shù)據(jù)。過幾小時到十幾小時不等,之后會onClose(不知道啥原因),我在里面運行reConnect,有時可以重連成功,有時失敗。
從沒有觸發(fā)過onError。
報錯:Sec-WebSocket-Accpet not match.
圖片
而且一大串數(shù)據(jù)輸出之后還有error package. package_length=false
?
在網(wǎng)上搜了半天沒找到相關(guān)內(nèi)容,還請大佬指點

服務(wù)端用的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();
11436 3 0
3個回答

phpcreeper
  1. 保證已經(jīng)成功設(shè)置好了心跳。
  2. 客戶端onClose方法中關(guān)于Timer部分的代碼整體替換為:$conn->onClose = function($conn) {
    $conn->reconnect(3);
    }
  • zhyt0520 2019-02-07

    心跳這么用的,應(yīng)該可以吧,每三十秒發(fā)送一次
    $conn->onConnect = function($conn) {
    Timer::add(30, function() use ($conn)
    {
    $conn->send(date("Y-m-d H:i:s"));
    });

    onClose回調(diào)中的reConnect,我之前就是你說的這樣寫的,運行時間長了出問題,終端的輸出會停在最后一個reConnect(),看不到其他任何信息,之后我才改成現(xiàn)在的樣子,看到了Sec-WebSocket-Accpet not match.看到了截圖里的信息

  • walkor 2019-02-08

    更新下workerman試下

  • zhyt0520 2019-02-12

    @1:查了一下,服務(wù)端的worker是3.5.17,客戶端這邊是3.5.18,跟版本不一致有關(guān)系嗎?把服務(wù)端更新成3.5.18?

  • walkor 2019-02-12

    對,更新下就好了

  • zhyt0520 2019-02-13

    @1:

zhyt0520

@walkor:?
我更新完workerman,不再報錯了Sec-WebSocket-Accpet not match.但是重連連不上的問題仍然沒解決,客戶端這邊是下面截圖的樣子,服務(wù)端那邊也沒有錯誤信息
[attach]1716[/attach]?
多次測試發(fā)現(xiàn),發(fā)生 onClose 并且 reConnect 連不上的情況都出現(xiàn)在早晨六點五十多的時候
而且這個客戶端連不上的時候,我再開個新的客戶端去連服務(wù)器也連不上,把出問題這個關(guān)掉之后,就可以再開多個客戶端重新連接服務(wù)器了
?
還麻煩大佬給看看問題在哪,或者指點我一下監(jiān)控進程的思路,發(fā)現(xiàn)reConnect失敗之后如何關(guān)掉當前進程并重新開一個新的

  • walkor 2019-02-13

    按照手冊優(yōu)化下linux內(nèi)核,安裝下event擴展

  • zhyt0520 2019-02-13

    @1:我測試的時候是只連了一個客戶端的,我看手冊上寫是并發(fā)高的時候需要優(yōu)化內(nèi)核

walkor 打賞

?$conn->onClose = function($conn) {
$conn->reconnect(3);
};
重連是這樣重連的,自身已經(jīng)有定時邏輯,不能再放到定時器里。

  • zhyt0520 2019-02-15

    升級3.5.18,并且把重連改回
    $conn->onClose = function($conn) {
    $conn->reconnect(3);
    };
    這樣用一個客戶端連了快三天了,還是每天早晨六點五十多會斷開,但是可以成功重連

  • zhyt0520 2019-02-15

    每天早晨六點五十多斷這一下,是workerman里的設(shè)置嗎?還是我這服務(wù)器或者客戶端的問題?

  • walkor 2019-02-16

    workerman沒這個設(shè)置。有可能服務(wù)端會定時關(guān)閉連接

  • zhyt0520 2019-02-17

    @1:運行了四天多,今天早晨斷了沒重連上。workerman里reConnect()失敗之后默認是什么處理邏輯???可以自定義嗎?

  • walkor 2019-02-18

    reconnect失敗后會執(zhí)行onClose,由于reconnect還會在onClose里調(diào)用,所以還會再次重連

年代過于久遠,無法發(fā)表回答
??