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);
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. –
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. –