我有一个node.js服务器与客户端网页进行通信,并向其发送消息。基于许多教程和搜索堆栈溢出,这很好用。)
我遇到问题的地方是当我尝试启动与第三方cmd行的单独套接字连接时,可执行实例作为套接字服务器运行。第三方可执行文件不符合socket.io
命名空间/房间类型的事件,因此我读到socket.io-events
可能有助于而不是:
socket.on('some key', function(){/**do stuff*/}); I could:
eventRouter.on('*', function(){/*do stuff*/});
对于此通信,我假设我需要在node.js端使用socket.io-client
才能与cmd可执行文件通信,但我在尝试执行socket2.use(router);
时遇到异常其中socket2是我的socket.io-client
,路由器是socket.io-events
对象。
所有在localhost上运行,节点到网页是端口8001,node.js到可执行文件是在端口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);
});
});
答案 0 :(得分:0)
在JGreenwell的帮助下,我能够解决我的问题。 我最终让节点服务器通过socket.io连接与客户端html页面进行消息通信。节点服务器将启动cmd行可执行文件,为其提供连接的端口,该端口与使用的socket.io端口不同。
一旦启动,可执行文件将通过网络模块与服务器通信。服务器只是将信息传递给socket.io连接。 html页面中的js知道如何解析消息以增加进度条并在文本区域控件中列出消息。
通过将消息广播到socket.io连接上的多个客户端,我更进一步。