我正在尝试使用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);
答案 0 :(得分:1)
总结一下我和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);
}
});
});