2016-06-16 18 views
1

私はアンドロイドのsocket.ioでワンツーワンチャットアプリを開発しています。私は&のメッセージを1つのチャットルームから受け取ることができます。私はthis tutorialに従っています。私のアプリケーションのチャットモジュールはthatのように見えます。今、私は&メッセージを単一のユーザーから受信したいと思う。その理由から、私はメッセージを送信するために特定のユーザーを追跡することはできませんアンドロイドのソケットioでチャットアプリケーション用

/#IyQ7LaKzLClf7g3DAAAA 

は開発中、私はそれぞれ、すべてのソケット接続は、socket.ioがクライアントにのように見える新しいIDを与えることを観察しました。

Q 1.特定のユーザー&にメッセージを送信するためのユーザー資格情報を格納するデータベースを接続して、オフラインメッセージを送信する必要がありますか?チャット機能は私のアンドロイドアプリの追加機能です。現在、このアプリはトークンベースの認証を使用しています。

私はノードjs & socket.ioには初心者です。これを解決する方法については、アーキテクチャのガイドラインを教えてください。 TIA。

マイapp.jsコード:

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


var port = process.env.PORT || 3000; 

server.listen(port, function() { 
    console.log('Server listening at port %d', port); 
}); 

// Routing 
app.use(express.static(__dirname + '/public')); 

// Chatroom 
var numUsers = 0; 
var clients = []; 

io.on('connection', function (socket) { 
    var addedUser = false; 
    clients.push(socket); 

    console.log('one user connected: user name: ' +socket.username +"------ id : >> "+ socket.id); 
    console.log('Total User List:' + clients); 

    socket.on('connect', function (data) { 
     // we tell the client to execute 'new message' 
     socket.broadcast.emit('connect', { 
      username: socket.username, 
      numUsers: numUsers, 
      socket_id:socket.id 
     }); 
    }); 

    // when the client emits 'new message', this listens and executes 
    socket.on('new message', function (data) { 
     // we tell the client to execute 'new message' 
     socket.broadcast.emit('new message', { 
      username: socket.username, 
      message: data 
     }); 
    }); 

    // when the client emits 'add user', this listens and executes 
    socket.on('add user', function (username) { 
     if (addedUser) return; 

     // we store the username in the socket session for this client 
     socket.username = username; 
     ++numUsers; 
     addedUser = true; 
     socket.emit('login', { 
      numUsers: numUsers 
     }); 
     // echo globally (all clients) that a person has connected 
     socket.broadcast.emit('user joined', { 
      username: socket.username, 
      numUsers: numUsers, 
      socket_id:socket.id 
     }); 
    }); 

    // when the client emits 'typing', we broadcast it to others 
    socket.on('typing', function() { 
     socket.broadcast.emit('typing', { 
      username: socket.username 
     }); 
    }); 

    // when the client emits 'stop typing', we broadcast it to others 
    socket.on('stop typing', function() { 
     socket.broadcast.emit('stop typing', { 
      username: socket.username 
     }); 
    }); 

    // when want to send message to specific user 
    socket.on('say to someone', function (id, msg) { 

     socket.broadcast.to(id).emit('say to someone', { 
      username: socket.username, 
      id:id, 
      message: msg 
     }); 

    }); 

    // when the user disconnects.. perform this 
    socket.on('disconnect', function() { 

     clients.splice(clients.indexOf(socket), 1); 
     console.log('Disconnected... ' + socket.id); 
     if (addedUser) { 
      --numUsers; 
      // echo globally that this client has left 
      socket.broadcast.emit('user left', { 
       username: socket.username, 
       numUsers: numUsers 
      }); 
     } 
    }); 
}); 
+2

下記のリンクを参照してください。動的に変更された特定のユーザーとチャットで通信するには、サーバー側でレジストリを維持することができます。あなたは、ランタイムのために少量のデータに対してデータベースまたは単純なHashMapを使用することができます –

+0

@rev_dihazum返信ありがとうございます。 Qs。 1。ノードjsに適していますか?私のアプリはすでに認証のためにMySQLを使用しています。 Qs 2.オフラインメッセージの場合。私はそれをdbに保存しますか? –

+1

既存のデータベースを使用できます。また、単にレジストリを維持するだけで、mongoDB、couchDBなどのNoSQLデータベースを使用してパフォーマンスを向上させることもできます。アンドロイド側のオフラインメッセージは、オフラインであなたのアプリがサーバー側のmysqlに接続されていない可能性があります。デバイスにオフラインメッセージを保存することができます。例えばSQLite。 –

答えて

関連する問題