Node.js的socket.io服务器回调不起作用。

6
我正在开发一个简单的Node.js双向客户端/服务器通信频道,我正在尝试在服务器上使用socket.io,在客户端上使用socket.io-client。如下面所示的代码非常基本,我在本地机器上运行两者以最小化复杂性。我看到的行为是:1.我启动了服务器。2.服务器在控制台中记录“Server started”。3.我启动了客户端。4.客户端记录“Server is ready!”5.什么也没有发生...我预期的是服务器记录一个"Client is ready!"消息,然后是内容("Ready received")。我甚至使用WireShark嗅探了一下线路,似乎客户端按设计发出了消息,但是服务器上的回调并未触发。我正在运行node v0.8.4,带有express v3.1.0,socket.io v0.9.13和socket.io-client v0.9.11(所有这些都是通过npm安装的)。以下是服务器代码...
var http = require('http'),  
    express = require('express'),
    app = express(),
    server = http.createServer(app);

app.configure(function(){
  app.use(express.static(__dirname + '/public'));
});

server.listen(8080);
console.log("Server started");

var io = require('socket.io').listen(server);

io.sockets
     .on('connection', function(socket){ 
          socket.emit('server ready', { msg: 'ready' }) ;
      })

     .on('comms', function(content) {
          console.log('Client is ready!');
          console.log(content);
     });

下面是客户端代码...

    var clientio = require('socket.io-client');
    var socket = new clientio.connect('http://localhost', { port: 8080 });

    socket
     .on('server ready', function(data){
          console.log('Server is ready!');
          socket.emit('comms', 'Ready received');
    })  

     .on('connect-error', function(error) {
          console.log('Connection Error\n' + error);
    })

     .on('error', function(error) {
          console.log('Socket Error\n' + error);
    })

关于 socket.iosocket.io-client 的文档和示例有些混乱(说实话),而且它们似乎是一个移动目标......但从我的了解来看,我认为这应该可以工作。

我希望有人能给我一些建议,告诉我哪里出错了?


我不确定server ready事件名称...尝试使用没有空格的server_ready... - udidu
“服务器已准备就绪”回调正在触发,因为我在控制台上看到了“服务器已准备就绪!”的消息。问题出在服务器上的“通讯”回调没有触发。 - Jon Deeming
是的,你说得对,现在我再看一遍你的问题..请看下面我的回答。 - udidu
2个回答

4

你的服务器上有这段代码:

io.sockets
 .on('connection', function(socket){ 
      socket.emit('server ready', { msg: 'ready' }) ;
  })

 .on('comms', function(content) {
      console.log('Client is ready!');
      console.log(content);
 });

你需要做的是像这样操作:
io.sockets.on('connection', function(socket){
    socket.emit('server ready', { msg: 'ready' });

    socket.on('comm', function(content){
        console.log('Client is ready!');
        console.log(content);
    });

});

太准确了!我搞错了作用域。谢谢你。 - Jon Deeming
是否有任何回调函数在对等方由于某些网络问题而断开连接时被调用? - Rishabh Dhiman

4
希望这段代码正在做你需要的事情。只需要做一些小改动。 app.js
var app     = require('express')()
    , server  = require('http').createServer(app)
    , io      = require('socket.io').listen(server);

    // using 'connect' to handle static pages
    app.use(require('connect').static(__dirname + '/public'))
    server.listen(8080);

    app.get('/', function (req, res) {
        res.sendfile(__dirname + '/index.html');
    });

    io.sockets.on('connection', function (socket) {
        socket.emit('server ready', { msg: 'ready' });

        socket.on('comms', function(content) {
            console.log(('Client is ready\n'));
            console.log(content);
        });
    });

index.html

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">

</script>

<script>
window.jQuery || document.write('<script src="js/jquery-1.8.3.min.js"><\/script>')
</script>

<script src="/socket.io/socket.io.js"></script>
</head>

<body>
<script>
(function (d, b) {

    function bindEvents() {
        function doSomething(msg) {
            $.each(msg, function (key, value) {
                console.log('doSomething...');
                $("body").append("<p>" + value + "</p>")
            });
        };

    // var socket = io.connect();
    var socket = io.connect('http://localhost');

    socket.on('server ready', function (msg) {
        console.log('Server is ready!\n', msg);
        doSomething(msg);
        socket.emit('comms', {
            msg: 'Client is Ready'
        });
    });

    socket.on('connect-error', function (err) {
        console.log('Connection Error\n', err);
    });

    socket.on('error', function (err) {
        console.log('Connection Error\n', err);
    });
};

$(document).ready(function () {
    bindEvents()
});

})(jQuery, this)
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接