我一直在尝试在localhost上配置Ratchet,并一直关注this tutorial。
我已经安装了Composer和Ratchet,并且完全复制了该教程中的PHP代码。当我运行服务器并使用telnet
访问它时,我没有问题,它运行正常。
但是,当我尝试使用JavaScript建立连接(使用HTML5 websockets)时,它不会连接 - 请求只是在一段时间后超时。我可以在PHP控制台和telnet中看到我的浏览器发送的初始HTTP请求消息,因此客户端显然可以" connect"很好 - 看起来好像服务器没有确认这个请求。
我事先在StackOverflow和其他类似网站上查看了其他人的问题,有些人提到服务器必须发回HTTP回复,我试过这样做(使用{{1}最近连接的客户端的方法,如果他们的消息以send
开头。我在MDN上查找了一些相关的规范,并找到this guide,但我对它的实现对问题没有影响 - JavaScript仍然无法连接。我不确定这是因为我错误地实现了握手代码,或者它是不是我最初问题的解决方案。
WebSocket + Ratchet指南都没有提到实现这一点的必要性,所以我怀疑这可能不是问题。
我尝试了两个端口GET HTTP/1.1
和8080
,两者都有相同的结果。我在Google Chrome 60中的macOS上使用XAMPP。
这是我的JavaScript代码:
8888
这是我的PHP服务器代码(window.onload = function() {
var conn = new WebSocket('ws://localhost:8080');
conn.onmessage = function(e) {
console.log(e.data);
}
conn.onopen = function(e) {
console.log("Connection established!");
}
}
):
bin/chat-server.php
这是Chat类(<?php
use Ratchet\Server\IoServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new Chat(),
8080
);
$server->run();
):
src/MyApp/Chat.php
答案 0 :(得分:0)
所以,你不需要实现握手,Ratchet会为你做这件事。
所有你需要做的就是像我上面那样获得代码,确保你使用像这样的WebServer:
<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();