【发布时间】: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