如何使用 ReactPHP 和 Ratchet 在同一端口上运行 WebSocket

我有以下代码:


use Ratchet\Http\HttpServer;

use Ratchet\WebSocket\WsServer;


$loop = \React\EventLoop\Factory::create();


$socketServer = new \React\Socket\Server('127.0.0.1:8080', $loop);


$httpServer = new \React\Http\Server(function(\Psr\Http\Message\ServerRequestInterface $request) {

  return new \React\Http\Response(200, [

      'Content-Type' => 'text/plain'

    ],

    'Hello, World'

  );

});


$httpServer->listen($socketServer);


$rrServer = new RRServer(); // Implements MessageComponentInterface


$webSocketServer = new IoServer(

  new HttpServer(

    new WsServer(

      $rrServer

    )

  ),

  $socketServer,

  $loop

);


$webSocketServer->run();

该代码有效,但我只能使用http://localhost:8080访问它,当我尝试使用 WebSocket 连接时,连接打开,然后立即关闭。另外,当我创建一个具有不同端口的新套接字时,我可以同时使用 http:// 和 ws://


我的代码有什么问题?如何在同一个端口上运行 WebSocket 和 HTTP Server?


泛舟湖上清波郎朗
浏览 227回答 2
2回答

慕哥9229398

嘿 ReactPHP 核心团队成员。简而言之,您可以在一个端口上使用so_reuseport套接字服务器上的两个服务器进行侦听,但这只是与其中任何一个的循环连接。你可以做的是尝试 cboden 的建议,我在这里做了,如果你有任何问题,请告诉我们:https ://github.com/ratchetphp/Ratchet/issues/771#issuecomment-569439423即:您的代码试图将两个 SocketServer 连接到同一个端口。您需要将单个 SocketServer 附加到一个端口,然后根据您选择的条件(例如 HTTP 标头、端点或子域)重新路由流量。请参阅https://github.com/ratchetphp/Ratchet/blob/master/src/Ratchet/App.php类或一些https://github.com/reactphp/http/blob/master/examples/82-server- upgrade-chat.php以获得一些灵感。看看:https ://github.com/voryx/WebSocketMiddleware

不负相思意

实际上你不能在同一个端口上运行多个 websocket。但您可以将所有 websocket 合二为一。并用这样的 url 查询将它们分开。http://localhost:8080?source=socket_1http://localhost:8080?source=socket_2并且在您的代码中可以通过以下方式获取请求来源:function onOpen( ConnectionInterface $conn ) {    $querystring = $conn->WebSocket->request->getQuery()->toArray();    if($querystring['source'] == 'socket_1'){        // run socket 1 jobs    else{        // do socket 2    }    // and change}我没有这样做,我没有测试它。所以 ... :)
打开App,查看更多内容
随时随地看视频慕课网APP