通过nodejs socket.io连接cmd行套接字服务器

时间:2015-07-06 02:33:02

标签: node.js socket.io

我有一个服务器与客户端网页进行通信,并向其发送消息。基于许多教程和搜索堆栈溢出,这很好用。)

我遇到问题的地方是当我尝试启动与第三方cmd行的单独套接字连接时,可执行实例作为套接字服务器运行。第三方可执行文件不符合socket.io命名空间/房间类型的事件,因此我读到socket.io-events可能有助于而不是:

socket.on('some key', function(){/**do stuff*/}); I could:
eventRouter.on('*', function(){/*do stuff*/});

对于此通信,我假设我需要在端使用socket.io-client才能与cmd可执行文件通信,但我在尝试执行socket2.use(router);时遇到异常其中socket2是我的socket.io-client,路由器是socket.io-events对象。

所有在localhost上运行,节点到网页是端口8001,到可执行文件是在端口8002上。请原谅代码,因为我一直试图让它工作几天,是一个现在有点难看

要执行的cmd可执行文件及其参数我来自可以正常工作的网页。我能够启动exe。 EXE期望在发送的每条消息上都有ACK,这就是为什么你看到代码发回它的原因。

我有一个间隔,我在网页上设置和更新元素。我有另一个设置消息的元素(msg)。

var http = require('http');
var url = require('url');
var fs = require('fs');
var server;

server = http.createServer(function(req, res){
// your normal server code
var path = url.parse(req.url).pathname;
switch (path){
    case '/':
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write('<h1>Hello! Try the <a href="/test.html">Test page</a>    </h1>');
        res.end();
        break;
        case '/socket.html':
            fs.readFile(__dirname + path, function(err, data){
                if (err){
                    return send404(res);
                }
                res.writeHead(200, {'Content-Type': path == 'json.js' ? 'text/javascript' : 'text/html'});
                res.write(data, 'utf8');
                res.end();
            });
            break;
            default: send404(res);
        }
    }),

    send404 = function(res){
        res.writeHead(404);
        res.write('404');
        res.end();
    };

    server.listen(8001);
    var str = "ack0";
    var bytes = [];

    for (var i = 0; i < str.length; ++i) {
        bytes.push(str.charCodeAt(i));
    }

    // use socket.io
    var io = require('socket.io').listen(server);
    // define interactions with client
    io.sockets.on('connection', function(socket){
        //send data to client
        setInterval(function(){
            socket.emit('date', {'date': new Date()});
        }, 1000);

        //recieve client data
        socket.on('client_data', function(data){

        var spawn = require('child_process').spawn;
        console.log('pre-spawned');
        spawn(data.cmd, data.args, {});

        setTimeout(function() {
            console.log('hello world!');
        }, 1000);
        var aptIO = require('socket.io-client');
        var router = require('socket.io-events')();
        var socket2 = aptIO.connect('localhost:8002', {reconnect: true});

        router.on('connection', function(s){
            //send data to client
            console.log('apt');

            router.on('*', function(sock, args, next){
                var name = args.shift(), msg = args.shift();
                console.log(name + " " + JSON.stringify(msg));
                sock.emit(bytes);
                io.sockets.emit('msg', {'msg': JSON.stringify(msg)})
                next();
            });
            s.emit(bytes);

        });
        console.log('spawned');

        // getting runtime exceptions here...have tried various things...
        socket2.use(router);
    });

});

1 个答案:

答案 0 :(得分:0)

在JGreenwell的帮助下,我能够解决我的问题。 我最终让节点服务器通过socket.io连接与客户端html页面进行消息通信。节点服务器将启动cmd行可执行文件,为其提供连接的端口,该端口与使用的socket.io端口不同。

一旦启动,可执行文件将通过网络模块与服务器通信。服务器只是将信息传递给socket.io连接。 html页面中的js知道如何解析消息以增加进度条并在文本区域控件中列出消息。

通过将消息广播到socket.io连接上的多个客户端,我更进一步。