2012-03-13 15 views
3

phpを使ってnodeJs + MYSQLにチャットシステムを構築したいと思います。 1対1のプライベートチャットとなり、データベースにチャットを保存します。私がどこから始める必要があるかは誰でも知っています。Nodejs PHPを使ったプライベートチャット

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

app.listen(8181); 

// routing 
app.get('/', function (req, res) { 
res.sendfile(__dirname + '/index.html'); 
}); 

// usernames which are currently connected to the chat 
var usernames = {}; 

io.sockets.on('connection', function (socket) { 

// when the client emits 'sendchat', this listens and executes 
socket.on('sendchat', function (data) { 
    // we tell the client to execute 'updatechat' with 2 parameters 
    io.sockets.emit('updatechat', socket.username, data); 
}); 

// when the client emits 'adduser', this listens and executes 
socket.on('adduser', function(username){ 
    // we store the username in the socket session for this client 
    socket.username = username; 
    // add the client's username to the global list 
    usernames[username] = username; 
    // echo to client they've connected 
    socket.emit('updatechat', 'SERVER', 'you have connected'); 
    // echo globally (all clients) that a person has connected 
    socket.broadcast.emit('updatechat', 'SERVER', username + ' has connected'); 
    // update the list of users in chat, client-side 
    io.sockets.emit('updateusers', usernames); 
}); 

// when the user disconnects.. perform this 
socket.on('disconnect', function(){ 
    // remove the username from global usernames list 
    delete usernames[socket.username]; 
    // update list of users in chat, client-side 
    io.sockets.emit('updateusers', usernames); 
    // echo globally that this client has left 
    socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has   disconnected'); 
}); 
    }) 
+0

正確に何が必要ですか?あなたはすでにサーバーを書く方法を知っています。クライアント側の実装に問題がありますか? – freakish

+0

初心者として、私はサーバーを構築することができます、私は接続がすべてのクライアントにメッセージをブロードキャストするようにプライベートチャットを達成するためにクライアントサーバーの通信を行う方法を混乱させる。 –

答えて

4

は2つの方法があります。

現在、私は、サーバーのためにこのコードを得ました。 Thirstでは、配列内のすべてのソケット(少なくともこれらのソケットのID)への参照を保持することができます。ユーザーがプライベートメッセージを発行すると、ターゲットソケットの配列を検索し、この特定のソケットに送信します。これは、ソケットのIDのいくつかの種類を保持する必要があります。内部のsocket.idを使用することができますが、クライアントが再接続すると問題になります(新しいIDが生成されます)。また、アプリが複数のマシンで動作する(接続されたクライアントの配列を共有できない)別の問題があります。

第2の方法は、部屋を使用することです。クライアントが接続するたびに、私は彼が名前を持っていると思います。例えば、Johnです。そして、あなたは彼の接続のために、このようなものを使用することができます。

socket.join('/priv/'+name); 

は今、この部屋を作成し、それにsocketを追加します。あなたはジョンにメッセージを送信したい場合、あなたは単にあなたがメッセージを/priv/John部屋にソケットに正確に行ってきましたことを確認することができ、その時点で

io.sockets.in('/priv/John').emit('msg', data); 

を使用しています。これはsocket.io(多くのマシンの問題を避けるため)とセッション許可を組み合わせたRedisと完全に動作します。私はmemoryStoreで試してみませんでしたが、うまくいくはずです。

また、クライアントが切断されたときに部屋を気にする必要はありません。 Socket.ioは空の部屋を自動的に破棄します。

関連する問題