【问题标题】:How to run WebSocket and HTTP Server on the same port using ReactPHP and Ratchet?如何使用 ReactPHP 和 Ratchet 在同一端口上运行 WebSocket 和 HTTP Server?
【发布时间】:2020-04-18 10:29:50
【问题描述】:

我有以下代码:

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?

【问题讨论】:

    标签: php http websocket ratchet reactphp


    【解决方案1】:

    嘿,这里是 ReactPHP 核心团队成员。简而言之,您可以使用套接字服务器上的so_reuseport 在一个端口上侦听两台服务器,但这只是与其中任何一个的循环连接。您可以尝试 cboden 和我在这里所做的建议,如果您有任何问题,请告诉我们:https://github.com/ratchetphp/Ratchet/issues/771#issuecomment-569439423

    分别是:

    【讨论】:

    • 感谢您的回答。目前,我创建了两个套接字,一个用于处理 WebSocket,另一个用于处理 HTTP 请求。
    【解决方案2】:

    实际上你不能在同一个端口上运行多个 websocket。但您可以将所有 websocket 合二为一。并用这样的 url 查询将它们分开。

    并且在您的代码中可以通过以下方式获取请求来源:

    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
    }
    

    我没有这样做,我没有测试它。所以... :)

    【讨论】:

    • 我想做的事情是在一个 Socket 上运行 WebSocket 和 HTTP 服务器,但它不起作用。
    猜你喜欢
    • 2018-01-30
    • 2016-08-14
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2015-01-07
    • 2017-06-09
    • 2016-04-20
    • 2012-11-27
    相关资源
    最近更新 更多