具有Node.js的用户可配置TCP流
我正在尝试使用node.js设置到客户端的TCP流,用户可以在其中指定数据主机和端口。我使用socket.io创建到客户端的套接字连接,并使用net.createConnection建立流。一旦建立了流,我需要将数据从流发送到客户机套接字。除了客户端更改主机和/或数据套接字的情况外,我的代码可以正常工作。似乎一旦建立了客户端套接字,我就可以更改TCP流上的端口或主机。接收到套接字消息,主机和端口的值使其到达正确的位置。但是没有乐趣,来自TCP流的数据没有连接,并且.on(错误)、.on(连接)等似乎不起作用。我是否有范围问题?下面代码块中的隐含范围是我当前设置它的方式。你能扔给我的任何骨头都会让狗高兴的。我身陷困境,似乎无法脱身具有Node.js的用户可配置TCP流,node.js,socket.io,Node.js,Socket.io,我正在尝试使用node.js设置到客户端的TCP流,用户可以在其中指定数据主机和端口。我使用socket.io创建到客户端的套接字连接,并使用net.createConnection建立流。一旦建立了流,我需要将数据从流发送到客户机套接字。除了客户端更改主机和/或数据套接字的情况外,我的代码可以正常工作。似乎一旦建立了客户端套接字,我就可以更改TCP流上的端口或主机。接收到套接字消息,主机和端口的值使其到达正确的位置。但是没有乐趣,来自TCP流的数据没有连接,并且.on(错误)、.on(连接)等
var express = require('express'),
app = module.exports = express.createServer(),
io = require('socket.io').listen(app, { log: false }),
host = "somehost",
port = 2001,
dataStream = net.createConnection(port, host);
io.sockets.on('connection', function(socket){
dataStream.on('error', function(error){
socket.emit('error',{message:"Data Connection Error "+ error});
});
dataStream.on('connect', function(){
socket.emit('connected',{message:"Data Source Connected"});
});
dataStream.on('data', function(data) {
socket.emit(buffer);
});
// Handle Client request to change stream
socket.on('message',function(data) {
var clientMessage = JSON.parse(data);
for(var key in clientMessage) {
switch (key){
case "connectString":{
if(clientMessage[key].dataHost !== "" && clientMessage[key].dataPort !== ""){
//create new net connection
dataStream.end();
dataStream = net.createConnection(clientMessage[key].dataPort,clientMessage[key].dataHost);
}
break;
}
}
}
});
});
app.configure(function(){
app.set('views', __dirname + '/views');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use(express.errorHandler());
});
// Routes
app.get('/', routes.index.html);
app.listen(3000);
总结一下我和Ben Taber的上述评论,这个解决方案可能会更好:
// Set up a connection to host and port, and emit on socket
function getDataStream(socket, port, host) {
var dataStream = net.createConnection(port, host);
dataStream.on('error', function(error){
socket.emit('error',{message:"Data Connection Error "+ error});
});
dataStream.on('connect', function(){
socket.emit('connected',{message:"Data Source Connected"});
});
dataStream.on('data', function(data) {
socket.emit('data', data);
});
return dataStream;
}
io.sockets.on('connection', function(socket){
var dataStream = getDataStream(socket, port, host);
// Handle Client request to change stream
socket.on('message',function(data) {
var clientMessage = JSON.parse(data);
if('connectString' in clientMessage
&& clientMessage.connectString.dataHost !== ''
&& clientMessage.connectString.dataPort !== '') {
dataStream.end();
dataStream = getDataStream(socket,
clientMessage.connectString.dataPort,
clientMessage.connectString.dataHost);
}
});
});
总结一下我和Ben Taber的上述评论,这个解决方案可能会更好:
// Set up a connection to host and port, and emit on socket
function getDataStream(socket, port, host) {
var dataStream = net.createConnection(port, host);
dataStream.on('error', function(error){
socket.emit('error',{message:"Data Connection Error "+ error});
});
dataStream.on('connect', function(){
socket.emit('connected',{message:"Data Source Connected"});
});
dataStream.on('data', function(data) {
socket.emit('data', data);
});
return dataStream;
}
io.sockets.on('connection', function(socket){
var dataStream = getDataStream(socket, port, host);
// Handle Client request to change stream
socket.on('message',function(data) {
var clientMessage = JSON.parse(data);
if('connectString' in clientMessage
&& clientMessage.connectString.dataHost !== ''
&& clientMessage.connectString.dataPort !== '') {
dataStream.end();
dataStream = getDataStream(socket,
clientMessage.connectString.dataPort,
clientMessage.connectString.dataHost);
}
});
});
您正在用新的tcp连接替换
datastream
对象。在connectString
案例中,必须在datastream=net.createConnection
之后重新连接datastream
事件处理程序。还要注意,对于所有连接的客户端,您都有一个共享的datastream
,当一个客户端发送connectString
时,数据流将被替换(同样适用于所有客户端)。但是所有其他客户端的事件处理程序都将丢失。我建议您为每个客户端保留一个dataStream
(即,在连接
处理程序中初始化它。您将用新的tcp连接替换数据流
对象。您必须在连接字符串
案例中的数据流=net.createConnection
之后重新附加事件处理程序。还要注意,您有一个共享的数据流
对于所有连接的客户端,当一个客户端发送连接字符串时,数据流
将被替换(对于所有客户端也是如此)。但是所有其他客户端的事件处理程序都将丢失。我建议您改为为为为每个客户端保留一个数据流
(即,在代码<连接> <代码>处理器中初始化它。来自新手的多谢!这是我需要的骨头。太好了!如果答案是让你满意的,请考虑点击答案左边的大复选框来接受它。如果主机上的数据:端口退出,我会怎么重新连接数据流。我尝试过。在数据流中放置setTimeout.on('end',function(){setTimeout(function(){dataStream.connect(port,host);},1000);})当主机停止在数据流连接的端口上生成数据时,这个StimeTimeT似乎不被激活。非常感谢一个菜鸟!这是我需要的骨头。太棒了!如果答案是你满意的,请考虑通过点击答案左边的大复选框来接受它。我将如何重新连接?在主机:端口上的数据退出的情况下使用dataStream。我尝试在dataStream中放置setTimeout。在('end',function(){setTimeout(function(){dataStream.connect(port,host);},1000);})上;当主机停止在数据流连接的端口上生成数据时,此setTimeout似乎不会被激活。