WSS上的Websockets://似乎不会在服务器上触发事件

时间:2016-03-22 17:36:45

标签: javascript node.js websocket

我正在尝试设置一个基本的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(&#34;消息&#34;事件似乎永远不会在服务器上触发。我在这里不知所措。我的工作是http:// websocket服务器,但这是我第一次尝试wss:。我很感激任何见解。

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

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

证书是网站的工作通配符证书。

1 个答案:

答案 0 :(得分:0)

终于弄明白在忽略它一个月左右之后是什么。它与为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',

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