2014-11-22 125 views
0

使用nodejs我将数据流式传输到客户端/浏览器,并且没有任何问题地列出它们。我想要做的是通过点击它们将一些ID发送回服务器。无论如何,这里是我的代码。我希望你能告诉我在这种情况下我做错了什么。使用node.js上的socket.on方法从浏览器获取数据

服务器端

var socketServer = io.listen(server); 
socketServer.set('log level', 1); //don't log all emits etc 

socketServer.sockets.on('connection', function(socket) { 
    console.log('New connection logged'); 
    socketServer.sockets.emit('data', t.globalState); 
}); 

//This is not working! 
//I tried to put it in different places, no changes! 
socketServer.sockets.on('hello', function(data) { 
    console.log('Hello!'); 
}); 

socketServer.sockets.on('close', function(socket) { 
    console.log('socketServer has closed'); 
}); 

var t = new conwit(config.conwit); 

t.openStream = function() { 
    console.log('Opening Stream'); 
    t.createStream(); 
}; 
t.createStream = function() { 

    t.stream('statuses/filter', { 
     track: t.globalState.tags, 
     language: config.language 
    }, function(stream) { 

       stream.on('data', t.emitT); 
       stream.on('error', function(error) { 
        console.log("My error: ", error); 
        setTimeout(function() { 
         t.openStream(); 
        }, 30000); 

       }); 

    }); 

}; 

t.emitT = function (data) { 
     console.log(' receiving'); 
     if (data.text !== undefined) { 
      socketServer.sockets.emit('data', data); 
     } 
}; 

t.openStream(); 

return t; 

}; 

浏览器端

TM.socket.on('data', function(msg) { 
    alert('News from server: ' + msg); //this works 
    TM.socket.emit('hello', {msg:'Hello server'}); //this doesn't work! 
}); 

$('#send').on('click', function(event) { 
    event.preventDefault(); 
    TM.socket.emit('hello', { //this doesn't work 
     rF: "foo", 
     rT: "zazz", 
     ea: "limk" 
    }); 
}); 

没有错误/两侧日志消息。

回答

0

更改服务器的代码如下:

var socketServer = io.listen(server); 
// Are you sure you have instantiated the config variable you use here? 
var t = new conwit(config.conwit); 
socketServer.set('log level', 1); //don't log all emits etc 

// Every time a socket connects to the server, this callback executes. 
// Notice that there is a convenient 'socket' variable to use as a 
// handle for this specific socket. 
socketServer.sockets.on('connection', function(socket) { 

    console.log('New connection logged'); 

    socketServer.sockets.emit('data', t.globalState); 

    // This broadcasts the message to all the sockets (including the current 
    // one) 
    socketServer.sockets.emit('data', 'Hey everybody! A new client has connected!') 

    // This broadcasts the message to all the sockets but not the current 
    // one 
    socket.broadcast.emit('data', 'Hey everybody! A new client has connected!') 

    // Now when a specific socket emits the 'hello' event, this callback will 
    // execute... 
    socket.on('hello', function(data) { 
     console.log('Hello!'); 
     // ...and it will send a 'data' event back to the socket 
     socket.emit('data', 'Hello client! This is your server speaking.'); 
    }); 

    // ...add more socket and/or t events here 
}); 

注意,有三种方式与插座进行沟通;

  1. socketServer.sockets.emit(EVENT_NAME,EVENT_DATA):此发出一个事件,所有连接的插座,包括触发事件的一个。例如,假设一个网页绑定使用此代码在一个红色的按钮:

    socket.emit('red button clicked');

    然后,您的服务器上,你有这样的代码:

    socket.on('red button clicked', function() { socketServer.sockets.emit('boom', 'A user clicked the red button'); });

    用户每次点击在页面上的按钮上,所有客户端(包括点击按钮的客户端)都将收到“繁荣”事件。

  2. socket.broadcast.emit(EVENT_NAME,EVENT_DATA):这是与上面,所有的客户端将收到的情况下,除了谁上的按钮点击一个唯一的区别。

  3. socket.emit(event_name,event_data):这只会将'boom'事件发送给点击按钮的客户端。

欲了解更多信息,请参阅Socket.IO documentation

+0

这就像一个魅力。我错过了socketServer.sockets.on中的** socket **变量('connection',function(** socket **)),并且yes ** config.conwit **正确传递。 – hayzem 2014-11-23 10:41:06