【问题标题】:connect cmd line socket server via nodejs socket.io通过节点 js socket.io 连接命令行套接字服务器
【发布时间】:2015-07-06 02:33:02
【问题描述】:

我有一个 服务器与客户端网页通信,向它发送消息。根据许多教程和搜索堆栈溢出,这非常有效:)

我遇到的问题是,当我尝试启动到作为套接字服务器运行的第 3 方 cmd 行可执行实例的单独套接字连接时。第 3 方可执行文件不遵守 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 是我的 @987654330 @ 和路由器是socket.io-events 对象。

所有运行在本地主机上,节点到网页是端口 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);
    });

});

【问题讨论】:

  • 第 3 方可执行文件要么是 socket.io 服务器/客户端,要么不是。没有中间立场。如果它不支持 socket.io,那么它可能只是一个普通的套接字,您将不得不创建自己的数据包/消息。您可以使用 nodejs 中的 net 模块连接到普通套接字。这是首先要确定的——3rd 方命令行工具支持什么类型的连接?
  • 感谢您的信息。第 3 方可执行文件是普通套接字。我将尝试 net 模块,看看会发生什么。 C++ 是否支持 socket.io,这是我正在调用的可执行文件的编写内容。如果我这样做的话,我可能能够访问代码并使用 socket.io 对其进行原型...再次,谢谢。跨度>
  • 是的,socket.io 可用于 C++。这是一个实现:socket.io/blog/socket-io-cpp
  • 很高兴听到它可用于 c++。我能够让我的应用程序运行您的建议,即使用 net 模块作为 3rd 方可执行文件。我让网页与服务器通信以启动 exe。服务器启动在特定端口上连接到服务器的 exe。服务器通过 net 模块处理接收到套接字消息,然后将信息传递给客户端网页以通过 socket.io 进行处理。感谢您的帮助。

标签: node.js node.js node.js node.js socket.io


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 2012-03-28
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多