0

我使用 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,这一切都可以正常工作。

可能是什么问题?长期以来一直坚持这一点。请帮忙。

4

2 回答 2

1

我总是将 ssl 负担留给stunnel,这是一个 ssl 代理,它侦听您定义的安全端口(例如 443)并将所有已解密的传入流量转发到您的非 ssl 应用程序正在侦听的另一个端口(通常为 80) .

在这里,您有一个简单的 stunnel 配置的要点:https ://gist.github.com/mbenedettini/5911415

于 2013-07-04T15:07:23.713 回答
0

几天后我解决了这个问题。

问题出在客户端的以下行中。

var socket = io.connect("https://xyz.com:8888", {secure : true} );

我们不应该添加{secure : true},所以这条线就变成了

var socket = io.connect("https://xyz.com:8888" );

我是怎么知道这个解决方案的?我学习了如何使用 Chrome 开发工具分析 Web Socket 数据流量

很快我发现客户端{secure : true}作为数组的第一个元素发出。这改变了整个对象的结构。由于所有此服务器无法解析事件名称,因为第一个数组元素不包含事件名称。

我删除{secure : true}了它,它起作用了。:)

于 2013-07-06T18:29:08.760 回答