WebSocket无法与服务器建立连接。

3

我想在我的Symfony项目中通过WebSocket制作一个简单的聊天页面。

最初,我使用了React-php库,在终端上运行得非常完美,但是当我尝试将其连接到浏览器时,在Chrome上出现了以下错误:

Uncaught Error: INVALID_STATE_ERR: DOM Exception 11

并且在火狐浏览器上

Firefox can't establish a connection to the server at ws://localhost:8000/.

接下来我使用了Ratchet库,并按照教程操作,但是仍然遇到了同样的问题:在终端上工作正常,在浏览器上出现错误。 我在终端上使用telnet localhost 8000命令,而在浏览器中则使用javascript。

var conn = new WebSocket('ws://localhost:8000');
conn.onmessage = function(e) {
    console.log(e.data);
};
conn.send('Hello World!');

React的服务器端代码

require __DIR__.'/../vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$conns = new \SplObjectStorage();
$socket->on('connection', function ($conn) use ($conns) {
    $conns->attach($conn);
    $conn->on('data', function ($data) use ($conns, $conn) {
        foreach ($conns as $current) {
            if ($conn === $current) {
                continue;
            }
            $current->write($data);
        }
    });
    $conn->on('end', function () use ($conns, $conn) {
        $conns->detach($conn);
    });
});
$socket->listen(8000);
$loop->run();

以及Ratchet的服务器代码

require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/chat.php';
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
$server = IoServer::factory( new WsServer( new Chat() ), 8000);
$server->run();

另一件事是客户端页面的URL为localhost/X/chat,服务器为localhost/X/server,我尝试了使用ws://localhost:8000/X/server,但仍然无法正常工作。

3个回答

1

在建立连接之前,您不能调用send。 您需要绑定到onopen事件:

var conn = new WebSocket('ws://localhost:8000');
conn.onmessage = function(e) {
    console.log(e.data);
};
conn.onopen = function () {
    conn.send('Hello World!');
};

这应该解决您的问题。


如果连接正确,conn.send() 就可以使用。然而,我尝试了你的代码,但仍然不起作用。 - Erfan
你所说的“不工作”是什么意思?你是否收到了新的错误信息?如果是这样,我已经回答了你的问题。 - igorw

1
问题出在cURL扩展上,已解决。

你是怎么解决的?你具体做了什么让它工作了? - Adrian Covaci
七年过去了,我也不知道自己干了什么 :) 根据注释,可能我已经安装了 PHP 的 curl 扩展。 - Erfan
我想你可能不记得了,但我建议还是试一下.. 我很绝望,我的WebSocket无法连接,而且据我观察并不是cURL的问题.. - Adrian Covaci

0

据我所知,React\Socket打开了一个明文TCP/IP连接。

您可以使用任何明文TCP/IP客户端连接到您的服务器,例如telnet或任何其他TCP/IP库。

如果您想要使用WebSocket客户端(例如浏览器提供的客户端),则必须使用WebSocket服务器。Ratchet是一个构建在该项目之上的WebSocket服务器。

请查看此链接https://github.com/reactphp/socket/issues/142


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接