我正在尝试设置一个基本的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上进行连接。
证书是网站的工作通配符证书。
答案 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',
谁知道符号链接不受欢迎?好吧,现在我们都做了。