我使用Node JS和socket.io构建了一个应用程序。它工作正常。由于我必须通过安全连接移动应用程序,因此我更改了代码以支持SSL。
但是,现在我无法做socket.emit
。服务器和客户端都无法发出消息。
连接成功,但之后没有任何内容发生。
这是代码。
服务器端
var fs = require( 'fs' );
var options = {
key: fs.readFileSync('/etc/httpd/conf.d/ssl/*.xyz.in.key'),
cert: fs.readFileSync('/etc/httpd/conf.d/ssl/xyz.in.crt'),
requestCert: true,
rejectUnauthorized: false // Tried both, with and without this line.
};
var io = require( 'socket.io' ).listen( 8888, options );
io.sockets.on('connection', OnConnection );
io.set("origins", "*:*"); // Tried with and without this line.
// Called when a connection is made with a new Client.
function OnConnection ( socket )
{
console.log( socket.id + " connected" ); // This line gets printed.
socket.on('ev_SendMsgForApproval', OnMsgReceivedForModApproval );
}
function OnMsgReceivedForModApproval( data )
{
console.log( data ); //This does not get executed. :(
}
客户端
var socket = io.connect("https://xyz.com:8888", {secure : true} );
// This message get called for sure.
function OnMsgSendClick()
{
console.log( "Hi" ); // This gets printed on browser's console.
socket.emit( 'ev_SendMsgForApproval', { chatMsg: "Hi" } );
return false;
}
我也尝试从服务器发出,但该数据也没有到达客户端。在调试中,我能够看到服务器已经发出了一些东西,但是没有到达客户端。
如果没有SSL,这一切都很好。
可能是什么问题?很长一段时间都坚持这个。请帮忙。
答案 0 :(得分:1)
我总是将ssl负担留给stunnel,这是一个侦听您定义的安全端口的ssl代理(例如443),并将已经解密的所有传入流量转发到您的非ssl的另一个端口应用程序正在监听(通常是80)。
这里有一个简单的stunnel配置要点:https://gist.github.com/mbenedettini/5911415
答案 1 :(得分:0)
问题出在客户端的以下行中。
var socket = io.connect("https://xyz.com:8888", {secure : true} );
我们不应该添加{secure : true}
,因此该行只会变为
var socket = io.connect("https://xyz.com:8888" );
我是如何了解这个解决方案的? 我学会了如何analyse the Web Socket data traffic using Chrome Dev tools
我很快发现客户端正在发出{secure : true}
作为数组的第一个元素。这改变了整个对象的结构。由于所有这个服务器都无法解析事件名称,因为第一个数组元素不包含事件名称。
我删除了{secure : true}
并且它有效。 :)