Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Nodejs Private chat using php

Nodejs Private chat using php

Problem

I want to build a Chat system in nodeJs + MYSQL using php. It will be private chat one to one and will save chat in database. Anyone know from where I need to start.

Currently I got this code for SERVER:

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');
});
  })
Problem courtesy of: Sandy Fark

Solution

There are two ways. Thirst you can hold references to all sockets in an array (all at least IDs of these sockets). When a user emits private message you search the array for target socket and send it to this particular one. This requires to hold some kind of ID of a socket. You may use inner socket.id but it will be a problem when the client reconnects (new ID generated). And there is another problem when your app works on more then one machine (they cannot share arrays of connected clients).

The second way is to use rooms. Whenever client connects I suppose he has a name, for example John. Then you can use something like this for his connection:

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

Now this creates a room and adds socket to it. If you want to send message to John then you simply use

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

At that point you can be sure that the message went exactly to the socket in /priv/John room. This works perfectly with Redis combined with socket.io (to avoid many machines problem) and session authorization. I didn't try it with memoryStore, but it should work as well.

Also you don't have to worry about rooms when clients disconnect. Socket.io automatically destroys empty rooms.

Solution courtesy of: freakish

Discussion

View additional discussion.



This post first appeared on Node.js Recipes, please read the originial post: here

Share the post

Nodejs Private chat using php

×

Subscribe to Node.js Recipes

Get updates delivered right to your inbox!

Thank you for your subscription

×