首页 > 解决方案 > 使用 Ratchet 和 CakePHP 创建一个 Web Socket 服务器

问题描述

Xampp 在这里控制我的本地虚拟主机进行测试。我正在尝试让棘轮正常工作并正确创建 Web 服务器。问题是当我告诉系统转​​到 JS 中的 Web 套接字主机地址时,系统没有响应。

我知道我希望该地址等于当前地址。我将把它放在请求中,以便 JS 知道它是什么,但现在让我们说它 local.ezbusinessmanager.com 作为基本域,我将 Web 套接字服务器的端口设置为 8080。我有在名为 ChatServerCommand 的命令对象中执行此操作。

/**
 * Implement this method with your command's logic.
 * This starts the socket server.
 * Throws random warnings and errors most of the time on purpose.
 * If it makes it all the way through, you win!
 *
 * @param Arguments $args The command arguments.
 * @param ConsoleIo $io The console io
 * @return void The exit code or null for success
 */
public function execute(Arguments $args, ConsoleIo $io): void
{
    $port = $args->getArgument('port') ? intval($args->getArgument('port')) : 8080;
    $domain = Configure::read('App.fullBaseUrl') !== "localhost" ? Configure::read('App.fullBaseUrl') : 'local.ezbusinessmanager.com';
    $this->prepareDomain($domain);
    $io->success("Socket server now running on ws://$domain:$port");
    $server = new App($domain, $port);
    $server->route($domain, new Chat(), ['*']);
    $server->run();
}

/**
 * Remove http, https, www, and slashes from domain string.
 *
 * @param string $domain Domain to be prepared.
 */
public function prepareDomain(string &$domain): void
{
    // If URI is like, eg. www.way2tutorial.com/
    $domain = trim($domain, '/');

    // If not have http:// or https:// then prepend it
    if (!preg_match('#^http(s)?://#', $domain)) {
        $domain = 'http://' . $domain;
    }

    $urlParts = parse_url($domain);

    // Remove www.
    $domain = preg_replace('/^www\./', '', $urlParts['host']);
}

它似乎在我调用命令时运行,但是当我到达我的页面时,它告诉我它无法连接它没有到达服务器,因为如果有什么东西,Chat() 对象应该发送一个日志错误后端。

我用这个脚本调用它

"use strict";

const conn = new WebSocket('ws://local.ezbusinessmanager.com:8080');
conn.onopen = () => {
    console.log('connected to server...');
};
conn.onerror = e => {
    console.error('An error has occurred:', e.type);
};

标签: javascriptphpcakephpwebsocketratchet

解决方案


推荐阅读