繁体   English   中英

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

[英]connect cmd line socket server via nodejs socket.io

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

我遇到的问题是,当我尝试启动与第3方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.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);
    });

});

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

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

我通过将消息广播到socket.io连接上的多个客户端来进一步扩展了它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM