简体   繁体   中英

Node.js socket.io server callback not working

I'm working on a simple Node.js bi-directional client\\server communication channel and I'm attempting to use socket.io on the server and socket.io-client on the client.

I've inserted the code below, as you'll see it's pretty basic stuff, and I'm running both on my local machine - to minimise complexity.

The behaviour I'm seeing is:

  1. I start the server.
  2. The server logs 'Server started' to the console.
  3. I start the client.
  4. The client logs 'Server is ready!'
  5. Nothing else happens...

What I'd expect is the server to log a 'Client is ready!' message and then the content ( 'Ready received' ).

I've even used WireShark to sniff the line and it does appear that the client is emitting the message, as designed - but the callback on the server isn't firing.

I'm running node v0.8.4 with express v3.1.0 , socket.io v0.9.13 and socket.io-client v0.9.11 (all installed via npm ).

Here's the server code...

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);
     });

And here's the client code...

    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);
    })

The documentation and examples for both socket.io and socket.io-client are somewhat confused (to be charitable) and they appear to be a bit of a moving target... but from what I can tell, I think this should work.

I'm hoping someone can give me advice as to where I'm going wrong?

In your server you have this code:

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

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

What you should do is something like this:

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);
    });

});

hopefully this is doing more or less what you need it to do. Just a couple of minor changes.

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM