【问题标题】:Websockets over WSS:// doesn't appear to fire events on serverWSS:// 上的 Websockets 似乎不会在服务器上触发事件
【发布时间】:2016-04-25 04:56:15
【问题描述】:

我正在尝试设置一个基本的 WSS websockets 服务器。这是我的最小 HTML(带有嵌入式 javascript):

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test</title>
</head>
<body style="background-color:white">
<h1>Test of WSS server</h1>
<p>Status: <span id=status"></span></p>
<a href="javascript:message();">Click to send message</a>
<script src="/newjs/jquery-2.1.1.js"></script>
<script>
var connection;
$(document).ready(function () { 
        window.WebSocket = window.WebSocket || window.MozWebSocket;
        if (!window.WebSocket) {
                alert("browser says no");
                        console.log("Browser does not supports websockets");
                return;
        }
        setupConnection();
});
function message() {
        var msg = "Test Message";
        connection.send(msg);
}
function setupConnection() {
        connection = new WebSocket('wss://www.example.com:14000');
        connection.onerror = function(error) {
                console.log('onerror fired'); 
        };
        connection.onopen = function(event) {
                $("#status").html("Open");
        };
        connection.onmessage = function (message) {
                alert(message.data);
        };
}
setInterval(function() {
        if (connection.readyState !== 1) {
                setupConnection();
        }
        }, 5000);
</script>
</body>
</html>

以下是nodejs运行的JS服务器:

var fs=require("fs");
var ws_cfg = {
  ssl: true,
  port: 14000,
  ssl_key: '/httpd/conf/ssl.key/my.key',
  ssl_cert: '/httpd/conf/ssl.crt/my.crt',
  ca_cert: '/httpd/conf/ssl.crt/gd_bundle-g2-g1.crt'
};
var processRequest = function(req, res) {
  console.log("Request received.")
};
var httpServ = require('https');
var app = null;
app = httpServ.createServer({
  key: fs.readFileSync(ws_cfg.ssl_key),
  cert: fs.readFileSync(ws_cfg.ssl_cert),
  ca: fs.readFileSync(ws_cfg.ca_cert),
  },processRequest).listen(ws_cfg.port);
var WebSocketServer = require('ws').Server, ws_server = new WebSocketServer( {server: app});

ws_server.on('open',function(request) {
        console.log("opening");
});
ws_server.on('request', function(request) {
        console.log((new Date()) + ' Connection from origin ' + request.origin + '.');
        if (request.origin!='https://www.example.com') {
                console.log("rejecting request from " + request.origin + " as not coming from our web site");
                return;
        }
        var connection = request.accept(null, request.origin);
        connection.on('message', function(message) {
                console.log("Got a message");
        });
});

我使用节点启动服务器,然后在我的浏览器中加载网页(使用 FF 或 Chrome)。使用开发人员工具,我看到似乎建立了连接。在服务器端,我看到使用 netstat 建立的连接。我还在浏览器端的 onopen() 函数中放置了一个 alert(),它被触发了。

问题是没有生成控制台日志输出。执行 connection.send(mag) 时,on("message" 事件似乎永远不会在服务器上触发。我在这里不知所措。我把它作为 http:// websocket 服务器工作,但这是我的第一次尝试在 wss:. 我将不胜感激。

注意事项: 服务器名称不是 example.com,尽管这是我在代码中显示的。

防火墙允许任何人使用 TCP 协议连接端口 14000。

该证书是网站的有效通配符证书。

【问题讨论】:

    标签: javascript node.js websocket


    【解决方案1】:

    在忽略了一个月左右之后,终于弄清楚了它是什么。它与为 SSL 文件定义的符号链接 (/httpd) 相关,如下所示:

    ssl_key: '/httpd/conf/ssl.key/my.key',
    ssl_cert: '/httpd/conf/ssl.crt/my.crt',
    

    他们必须改为:

    ssl_key: '/usr/local/apache2/conf/ssl.key/my.key',
    ssl_cert: '/usr/local/apache2/conf/ssl.crt/my.crt',
    

    谁知道符号链接不受欢迎?好吧,现在我们都这样做了。

    【讨论】:

      猜你喜欢
      • 2015-06-25
      • 2012-04-17
      • 2013-07-28
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多