我正在尝试 使用这些说明在我的本地主机 apache Web 服务器上设置 Websockets 连接,但它不起作用。
我打开了
mod_proxy_wstunnel
和 mod_proxy modules
,所以我应该能够在本地主机上运行 websockets。如今 Apache Web 服务器内置了 Websockets 支持。安装第三方 Websockets apache 模块(如 Rachet)的日子已经一去不复返了。
按照上述问题中的说明进行操作后,我收到此错误。
未捕获的 DOMException:无法在“WebSocket”上执行“发送”:仍处于 CONNECTING 状态。
与“ws://socket.localhost/”的 WebSocket 连接失败:
我使用的是 apache 网络服务器,而不是 litespeed、lighttpd、nginx 或 IIS。
顺便说一句,我正在使用Uniform Server。
确保以下apache模块已打开
编辑已存在的名为 httpd.conf 的文件,然后将其插入其中。如果不同 apache 版本有重复的文件名,请确保编辑正确的文件
<VirtualHost *:80>
ServerName socket.localhost
ProxyRequests Off
ProxyPass "/ws2/" "ws://localhost:8546/"
ProxyPass "/wss2/" "wss://localhost:8546/"
</VirtualHost>
使用此 HTML 页面和内联 javascript 测试 websocket
<script type="text/javascript">
var socket = new WebSocket('ws://socket.localhost');
socket.send('Test');
</script>
下面是我通过 websocket 用于 GraphQL 订阅的示例。
IP 和端口应由您的配置替换。
确保您已安装这些模块:
proxy_module (shared)
proxy_http_module (shared)
proxy_wstunnel_module (shared)
rewrite_module (shared)
站点配置:
<VirtualHost *:443>
ServerName something.com
ServerAdmin web@localhost
DocumentRoot /var/www/html
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/subscription [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://ip:port/$1 [P,L]
ProxyPass "/subscriptions" "ws://ip:port/subscriptions"
ProxyPassReverse "/subscriptions" "ws://ip:port/subscriptions"
ProxyPass "/" "http://ip:port/"
ProxyPassReverse "/" "http://ip:port/"
</VirtualHost>
/Subscription
是我的 websocket 端点。你的可能会有所不同。
问题出在您的 javascript 代码上,只需尝试在 websocket.onopen 侦听器中发送消息,这就是您确保 WebSocket 不处于 CONNECTING 状态的方法。 下面是一个例子:
window.addEventListener("DOMContentLoaded", function (event) {
const socket = new WebSocket("ws://localhost:8745/");
socket.onopen = function () {
socket.send("hey there)
};
socket.onmessage=function(event){
console.log(event)
}
socket.onerror = function(error) {
console.error("WebSocket error:", error);
};
});