2012-03-26 8 views
1

Ich versuche, einen TCP-Stream zu einem Client mit node.js einzurichten, wo der Benutzer den Datenhost und Port angeben kann. Ich verwende Socket.io, um eine Socket-Verbindung zum Client und net.createConnection zu erstellen, um den Stream einzurichten. Sobald der Stream eingerichtet ist, muss ich die Daten aus dem Stream an den Client-Socket senden. Der Code, den ich habe funktioniert, außer im Falle des Clients den Host und/oder Datensocket ändern. Es scheint, sobald der Client-Socket eingerichtet ist, kann ich den Port oder Host im TCP-Stream ändern. Die Socket-Nachricht wird empfangen und die Werte für Host und Port machen sie an die richtige Stelle. Aber keine Freude, die Daten aus dem TCP-Stream ist nicht verbunden und es scheint, die .on (Fehler), .on (connect), usw. funktionieren nicht. Habe ich ein Problem mit dem Umfang? Der implizierte Umfang im Codeblock unten ist, wie ich ihn derzeit eingerichtet habe. Irgendwelche Knochen, die Sie meinen Weg werfen können, werden den Hund glücklich machen. Ich bin in einem Loch und kann nicht scheinen, auszusteigen.Benutzerkonfigurierbare TCP-Stream mit Node.js

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); 
+0

Sie ersetzt die 'datastream' Objekt mit einer neuen TCP-Verbindung. Sie müssen Ihre 'datastream' Event-Handler nach' dataStream = net.createConnection' im 'connectString'-Fall erneut anfügen. –

+0

Beachten Sie auch, dass Sie für alle verbundenen Clients einen gemeinsamen 'dataStream' haben, und wenn ein Client einen' connectString' sendet, wird der 'dataStream' ersetzt (wiederum für alle Clients). Die Event-Handler für alle anderen Clients gehen jedoch verloren. Ich schlage vor, dass Sie stattdessen einen 'dataStream' pro Client behalten (dh ihn innerhalb des 'connection'-Handlers initialisieren. –

Antwort

1

zu mir und Ben Taber Kommentare über diese Lösung funktionieren könnte besser zusammenfassen:

// 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); 
     } 
    }); 
}); 
+0

Vielen Dank von einem Anfänger !! Das war der Knochen, den ich brauchte. – lowjumpingfrog

+0

Großartig! Wenn die Antwort zu Ihrer Zufriedenheit war, bitte Übernehmen Sie es, indem Sie auf das große Kontrollkästchen links neben der Antwort klicken. –

+0

Wie würde ich dataStream wiederherstellen, wenn die Daten auf host: port beendet werden. Ich habe versucht, ein setTimeout in einen dataStream.on ('end', function() {setTimeout (function() {dataStream.connect (port, host);}, 1000);}); Dieses setTimeout scheint nicht aktiviert zu werden, wenn der Host keine Daten mehr auf dem Port erzeugt, mit dem dataStream verbunden ist. – lowjumpingfrog