【发布时间】:2015-07-06 02:33:02
【问题描述】:
我有一个node.js 服务器与客户端网页通信,向它发送消息。根据许多教程和搜索堆栈溢出,这非常有效:)
我遇到的问题是,当我尝试启动到作为套接字服务器运行的第 3 方 cmd 行可执行实例的单独套接字连接时。第 3 方可执行文件不遵守 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 是我的 @987654330 @ 和路由器是socket.io-events 对象。
所有运行在本地主机上,节点到网页是端口 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);
});
});
【问题讨论】:
-
第 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