2013-02-17 2 views
6

Ich arbeite an einem einfachen Node.js bidirektionalen Client \ Server-Kommunikationskanal und ich versuche, socket.io auf dem Server und Socket zu verwenden. io-client auf dem Client.Node.js socket.io Server-Callback funktioniert nicht

Ich habe den folgenden Code eingefügt, wie Sie sehen werden, ist es ziemlich einfach, und ich verwende beide auf meinem lokalen Rechner - um die Komplexität zu minimieren.

Das Verhalten Ich sehe ist:

  1. ich den Server starten.
  2. Der Server meldet 'Server gestartet' an die Konsole.
  3. Ich beginne den Client.
  4. Der Client meldet "Server ist fertig!"
  5. Nichts anderes passiert ...

Was ich würde erwarten, dass der Server ein anmelden 'Client ist fertig!' Nachricht und dann der Inhalt ('Bereit erhalten').

Ich habe sogar WireShark verwendet, um die Leitung zu schnüffeln und es scheint, dass der Client die Nachricht ausgibt, wie geplant - aber der Rückruf auf dem Server wird nicht ausgelöst.

Ich bin mit Knoten v0.8.4 mit Express v3.1.0, socket.io v0.9.13 und socket.io-Client v0.9.11 (alle über npm installiert).

Hier ist der 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); 
    }); 

Und hier ist der 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); 
    }) 

Die Dokumentation und Beispiele für beide socket.io und socket.io- Client sind etwas verwirrt (um wohltätig zu sein) und sie scheinen ein bisschen ein bewegliches Ziel zu sein ... aber von dem, was ich sagen kann, denke ich, sollte das funktionieren.

Ich hoffe, jemand kann mir Rat geben, wo ich falsch liege?

+0

Ich bin nicht sicher über die 'Server bereit 'Ereignisnamen .. versuchen' server_ready' ohne Raum ... – udidu

+0

Der ‚Server Bereit 'Callback wird ausgelöst, weil ich den' Server ist fertig! ' Nachricht auf der Konsole. Es ist der 'comms' Callback auf dem Server, der nicht feuert. –

+0

yeah du hast Recht, jetzt habe ich deine Frage erneut gesehen .. siehe meine Antwort unter – udidu

Antwort

4

In Ihrem Server haben Sie diesen 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); 
}); 

Was sollten Sie so etwas wie dies tun:

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

}); 
+0

Spot on! Ich hatte meinen Spielraum vermasselt. Vielen Dank. –

3

hoffentlich mehr oder weniger tun, was Sie es brauchen zu tun. Nur ein paar kleine Änderungen.

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>