在socketIO上的隧道websockets

时间:2017-07-13 03:14:17

标签: javascript node.js sockets google-chrome

我试图通过套接字IO隧道连接chrome的远程调试端口。

在Chrome运行的地方,我有一个nodeJS脚本,它将数据套接字IO(base 64编码)传输到chrome&反之亦然:

var net = require('net');

    chat.on('rdp-data', function(rdpData) {

        var client = net.Socket();
        client.connect(9222, '127.0.0.1', function() {
            console.log('rdp-data', new Buffer(rdpData.data, 'base64').toString('utf8'));
            client.write(new Buffer(rdpData.data, 'base64').toString('utf8'));
        });

        // when we get packets back from the client
        client.on('data', function(data) {
            // write those packets back to the server
            //sock.write(data);
            console.log('rdp-data-reply' + rdpData.request);
            chat.emit('rdp-data-reply' + rdpData.request, new Buffer(data).toString('base64'));
            console.log('sent2 ',new Buffer(rdpData.data, 'base64').toString('utf8'));
        });

        // Add a 'close' event handler to this instance of socket
        client.on('close', function(data) {
            console.log('CLOSED: ');
        });
        client.on('error', function(data) {
            console.log('error: ',data);
        });
    });

在另一台机器上,我有一个可监听9222的nodeJS脚本,并将数据传输到&来自套接字IO:

net.createServer(function(sock) {
                // We have a connection - a socket object is assigned to the connection automatically
                console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

                var request = Math.random();
                console.log('addListner rdp-data-reply'+request);
                connectedDeviceSockets[IDdata.sn].on('rdp-data-reply' + request, function (data) {
                    console.log('rdp data reply ' + request, new Buffer(data, 'base64').toString('utf8'));
                    sock.write(new Buffer(data, 'base64').toString('utf8'));
                });

                sock.on('data', function(data) {
                    connectedDeviceSockets[IDdata.sn].emit('rdp-data', {
                        data: new Buffer(data).toString('base64'),
                        request: request
                    })
                });

                // Add a 'close' event handler to this instance of socket
                sock.on('close', function(data) {
                    console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
                });
                sock.on('error', function(data) {
                    console.log('ERROR: ' + data);
                });
            }).listen(9222, '0.0.0.0');

            console.log('Server listening on 9222');

这一切都很完美,我可以在我的浏览器中加载另一台机器上的远程调试端口。所有HTML,JS& CSS加载。但是当devtools尝试执行ws://请求时,它会失败&我的隧道没有记录任何东西。如果我同时杀死nodeJS&设置一个ssh -L的隧道,一切都很完美。

我也尝试使用net套件的套接字,它运行正常,示例就在这里 - https://github.com/joshribakoff/devtools-proxy

我认为问题与尝试通过websocket隧道连接websocket有关(因为devtools使用websockets本身)。但是为什么我的脚本与使用SSH管道流量有什么不同?

我还发现了一些暴露CLI的npm模块来执行此操作,但我想在我的应用程序中重用现有的socketIO连接,而不是shell连接到另一个连接。

我尝试添加日志记录,但是我找不到任何与ws:// request devtools make相关的内容。这是我在运行devtools的页面上运行devtools的截图。除websocket外,所有资产都通过代理加载。

Devtools can load all assets thru the proxy, except the websocket

No frames are shown

0 个答案:

没有答案