2017-03-20 7 views
2

ich einen Knoten js Website mit Vorlage js azur Knoten erstellt haben die App verwendet Express- und Buchse ioWeb Azure Knoten js

Dies ist der Server-Code ich für jede Funktion eine einfache Server-seitigen Code mit Protokolle geschrieben haben

mein Server-Side-Code ist:

var express = require('express'); 
var app = express(); 
////Creating Server 
var server = require('http').createServer(app); 
//For Socket IO 
var io = require('socket.io').listen(server); 
var port = process.env.port || 1337 
server.listen(port); 
var connections = []; 
console.log('Server Running....'); 

io.sockets.on('connection', function (socket) { 
    connections.push(socket); 
    console.log('Connected: %s sockets connected', connections.length); 

socket.on('subscribe', function (room) { 
    //It's not logging this 
    console.log('Connections: ', connections.length, ' Room: ', room); 
    socket.join(room); 
}); 

socket.on('disconnect', function (data) { 
    connections.splice(connections.indexOf(socket), 1); 
    console.log('Disconnected: %s sockets still connected',  connections.length); 
}); 

socket.on('send message', function (data) { 
    console.log('Message.', data.message); 
     //this works fine when i comment the 'subscribe' function 
     io.sockets.emit('new message', { msg: data.message, room: data.room}); 

    //I want this to work 
    io.sockets.in(data.room).emit('new message', { msg: data.message, room: data.room }); 
}); 
}); 


}); 

Vom Client ich auf die Website verbinden und eine emit verwenden, um den bestimmten Raum zu verbinden

Side-Code Auftraggeber:

//Inside document.ready i am calling this 

var socket = io.connect('http://example.azurewebsites.net'); //url 
socket.emit('subscribe', 1);//Hardcoded 
$('#send').click(function (e) { // Send Button 
    socket.emit('send message', { 
      room: 1, 
      message: $('#message').val() // Input Box Value 
     }); 
}); 
socket.on('new message', function (data) { 
    console.log('Message :',data.message,'Room :',data.room); 
}); 

Das Problem, das ich bin vor ist die 'subscribe' -Funktion nicht funktioniert, bekommen ich keine Protokolle für sie.

Was könnte der Grund sein

+0

Rufen Sie 'socket.emit ('abonnieren')' sofort auf dem Client oder nachdem Sie verbunden sind? Wenn Sie sagen "Nachricht senden" und "neue Nachricht" funktionieren gut, können Sie klären. Im Beispiel werden sie ausgelöst, wenn sie diese Nachricht vom Server erhalten, aber im Serverbeispiel wird vom Client eine Nachricht gesendet. Außerdem haben Sie im 'emit'-Aufruf von' new message' ein extra ',' am Ende Ihres Datenobjekts, was wahrscheinlich der Grund ist, warum der nächste Anruf nicht funktioniert. – divillysausages

+0

ja, ich rufe sofort 'subscribe' an auf der Client-Seite. Die Nachricht senden Ich habe ein Eingabefeld und eine Schaltfläche zu senden, die bei Klick sendet die Nachricht und die console.log auf der Serverseite protokolliert die Nachricht und die, änderte ich aber immer noch die io.sockets.in [ Zimmer] funktioniert nicht, weil die Abonnement-Funktion scheint nicht zu funktionieren –

+0

Ich bekomme ein Protokoll für die Verbindung, ein Protokoll, wenn ich eine Nachricht sende, und die neue Nachricht ab sofort nur auf der Client-Seite anmelden Wetter die Nachricht zu sehen kommt zurück –

Antwort

3

Also ich Ihren Code nahm und ein neues Projekt zu testen.

Server:

var app = require('express')() 
var http = require('http').createServer(app); 
var io = require('socket.io')(http); 

// serve our main page 
app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
}); 

// called when socket.io gets an incoming connection 
io.on('connection', function(socket){ 

    console.log("Socket " + socket.id + " connected"); 

    // called when we disconnect 
    socket.on('disconnect', function(){ 
     console.log("Socket " + socket.id + " disconnected"); 
    }) 

    // subscribe to a room 
    socket.on('subscribe', function(room){ 
     console.log("Socket " + socket.id + " is connecting to room " + room); 
     socket.join(room); 
    }) 

    // called when the socket sends a message 
    socket.on('send message', function(data){ 
     console.log("Message from " + socket.id + ": " + data.message); 

     io.emit('new message', { msg: data.message, room: data.room }); 
     io.in(data.room).emit('new message', { msg: '[Room' + data.room + '] ' + data.message, room:data.room }); 
    }) 
}) 

// start our server 
http.listen(3000, function() { 
    console.log('Listening on *:3000'); 
}) 

Auftraggeber:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Socket.IO test</title> 
     <script src='/socket.io/socket.io.js'></script> 
     <script> 
      var socket = io(); 

      // listen for new messages 
      socket.on('new message', function(data){ 
       console.log("Received message", data); 
      }) 

      // subscribe to our room 
      socket.emit('subscribe', 1); 

      // send our message 
      socket.emit('send message', { 
       room: 1, 
       message: "Hello world" 
      }) 
     </script> 
    </head> 
    <body></body> 
</html> 

Abgesehen von kleinen stilistischen Unterschiede (Aufruf io.sockets überflüssig ist, habe ich nur den Client auch direkt eher ruft als durch eine Form, und ich entfernt die connections Array-Code und ist nicht relevant für das Problem), es ist das Gleiche.

Dies funktioniert für mich vor Ort.

Wenn Sie eine Verbindung zu einer externen Website herstellen, sollten Sie kein Protokoll für das Ereignis subscribe erhalten. Ich rate Ihnen daher, dass Sie subscribe anrufen, bevor der Client-Socket fertig verbunden ist.

Der Client verfügt über ein connect-Ereignis, das Sie innerhalb des Rückrufs hören und den subscribe-Aufruf verschieben können. So wird Ihr Client-Code jetzt das:

var socket = io(); 

// listen for new messages 
socket.on('new message', function(data){ 
    console.log("Received message", data); 
}) 

// called when we're connected 
socket.on('connect', function() { 

    // subscribe to our room 
    socket.emit('subscribe', 1); 

    // send our message 
    socket.emit('send message', { 
     room: 1, 
     message: "Hello world" 
    }) 
}) 
+0

Danke, ich werde es ausprobieren –