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

workerman無法給客戶端返回消息

schumyxp

現(xiàn)象描述:
服務(wù)器端通過Nginx做了代理。
客戶端能通過ws協(xié)議和后端連接上,但是一直顯示pending狀態(tài)。客戶端無法收到服務(wù)器端返回的消息,但是服務(wù)器端能收到客戶端請求建立鏈接的消息。

此時如果客戶端調(diào)用發(fā)送方法,比如 $connection->send('welcome!'); 服務(wù)器端沒有異常,但是客戶端收不到。

當停止workerman服務(wù)的時候,服務(wù)器端的消息反而能發(fā)送出去,此時客戶端也能收到消息。

也就是說,當服務(wù)啟動的狀態(tài)下,服務(wù)器發(fā)出去的消息都被阻塞了,并沒有發(fā)出去。請問這個問題怎么解決?

我試過單獨用workerman,不使用nginx做代理,一切正常。

PHP的代碼如下:

<?php
require __DIR__ . '/../../vendor/autoload.php';

use Workerman\Worker;

// 創(chuàng)建一個Websocket服務(wù)器
$ws_worker = new Worker("websocket://127.0.0.1:9100");

// 設(shè)置當前Worker實例啟動多少個進程
$ws_worker->count = 4;

// 在新連接到來時發(fā)出
$ws_worker->onConnect = function($connection) {
    $connection->send('welcome!');
    echo "new connection from ip " . $connection->getRemoteIp() . "\n";
};

// 接收數(shù)據(jù)時發(fā)出
$ws_worker->onMessage = function($connection, $data) {
    //echo "{$data}\n";
    $connection->send('got!');
};

// 連接關(guān)閉時發(fā)出
$ws_worker->onClose = function($connection) {
    echo "Connection closed\n";
};

// 運行worker
Worker::runAll();

Nginx的配置如下:

location /wss {
         proxy_pass http://127.0.0.1:9100;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "Upgrade";
         proxy_set_header X-Real-IP $remote_addr;
}

前端請求如下:

/**
執(zhí)行這行代碼之后,服務(wù)器端會顯示 new connection from ip 127.0.0.1
此時瀏覽器會顯示wss的請求狀態(tài)是pending。
如果在這個時候把服務(wù)器的workerman停止,瀏覽器會顯示101狀態(tài),并且能收到服務(wù)器發(fā)送的welcome字符串
*/
let ws = new WebSocket('ws://wodeyuming/wss')
/*
如果此時調(diào)用這條,會報錯:Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.
*/
ws.send(123)
1385 2 2
2個回答

schumyxp

實在搞不定,暫時先把Nginx去掉了。

  • 暫無評論
nitron

nginx的wss塊加一行

proxy_buffering off;
  • schumyxp 2023-08-18

    ????!確實有效

  • schumyxp 2023-08-23

    這個方法還是不太行啊。加上這行之后,只對第一次send起作用,后面再調(diào)用$connection->send,消息就發(fā)不出去了。不用Nginx的話一切正常。

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