2016-08-09 188 views
1

Sie vermuten, dass wir zwei registrierte Benutzer als User1 und User2 haben und beide im System angemeldet sind, jetzt User1 möchte Nachricht an User2 senden, nach dem Senden einer Nachricht an ihn, sagte mein Nodejs Server user2 nicht angeschlossen ist, und wenn Benutzer2 Nachricht an User1 senden möchten bekomme ich dies mitteilen, welche User1 nicht verbunden, aber beide Benutzer verbunden sind,Nodejs kann nur Nachricht an Besitzer Nachricht Absender senden

jetzt

  • User1 nur Nachricht an sich selbst schicken
  • Benutzer2 kann nur eine Nachricht an sich senden

aber sie konnten nicht Nachricht an andere Benutzer

var socket  = require('socket.io'), 
    express  = require('express'), 
    app   = express(), 
    server  = require('http').createServer(app), 
    io   = socket.listen(server), 
    port  = process.env.PORT || 3000, 
    redis  = require("redis"), 
    redisClient = redis.createClient(); 

var io_redis = require('socket.io-redis'); 
io.adapter(io_redis({host: 'localhost', port: 6379})); 

require('sticky-socket-cluster/replace-console')(); 

var options = { 
    workers  : require('os').cpus().length, 
    first_port : 8000, 
    proxy_port : 3000, 
    session_hash: function (req, res) { 
     return req.connection.remoteAddress; 
    }, 

    no_sockets: false 
}; 

require('sticky-socket-cluster')(options, start); 

function start(port) { 

    io.sockets.on('connection', function (socket) { 
     socket.on('login', function (data) { 
      console.log(data.username); 
      login(data.username, data.password, function (success, value) { 
       if (success) { 
        redisClient.exists(data.username, function (err, doesExist) { 
         if (err) return; 

         if (!doesExist) { 
          redisClient.set(data.username, socket.id, function (err, res) { 
           redisClient.set(data.username, socket.id); 
          }); 
         } 
         else { 
          redisClient.del(data.username); 
          redisClient.set(data.username, socket.id, function (err, res) { 
           redisClient.set(data.username, socket.id); 
          }); 
         } 

        }); 
        socket.emit('login', {result: true, id: value}); 
       } else { 
        socket.emit('login', {result: false}); 
       } 
      }); 
     }); 

     socket.on('requestMoney', function (data) { 

      redisClient.get(data.fromUsername, function (err, socketId) { 
       if (io.sockets.connected[socketId]) { 
        log.info('message to '+ data.fromUsername + ' sent'); 
        io.sockets.connected[socketId].emit('message', {message: 'Hey !!'}); 
       } else { 
        log.info(data.fromUsername + ' NOT Login'); 
       } 
      }); 

     }); 
    }); 

    server.listen(port, function() { 
     console.log('Express and socket.io listening on port ' + port); 
    }); 
} 
+0

@ Tom oh Mann !! Was ist das Problem in Ihrem Fall? –

Antwort

1

Problem

statt

io.sockets.connected[socketId].emit('')); 

ich diesen Code verwenden aufgelöst senden:

socket.broadcast.to(socketId).emit('')); 

jetzt kann ich Nachricht an sp senden ecific Benutzer von Web Android Benutzer angemeldet und von Android-Gerät auf dem Web-angemeldeten Benutzer

Mein Html Testcode jemand wen mehr erfahren mag, dass über die

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title> 
     Document 
    </title> 
    </meta> 
    <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> 
    <script src="http://code.jquery.com/jquery-latest.min.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $('#login').click(function() { 
       socket.emit('login', {username: 'mahdi', password: 'a'}); 
      }); 

      $('#mesage').click(function() { 
       socket.emit('requestMoney', {fromUsername: 'a'}); 
      }); 
     }); 
    </script> 
    <script> 
     var socket = new io.connect('http://192.168.1.35:3000', { 
      transports: ['websocket'] 
     }); 
     socket.on('connect', function() { 
      console.log('connected!'); 
     }); 
     socket.on('message', function (message) { 
      console.log("hello ::::::::" + message); 
     }); 
     socket.on('success', function (data) { 
      console.log(data); 
     }); 
    </script> 
</head> 
<body> 
<h3 id="login">login</h3> 

<h3 id="mesage">mesage</h3> 
</body> 
</html>