Nodejs private chat using php
I want to create a chat system in nodeJs + MYSQL using php. This will be a private one-to-one chat and will save the chat to the database. Does anyone know where I need to start from.
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 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');
});
})
source to share
There are two ways. Thirsty you can store references to all sockets in an array (all, at least the IDs of those sockets). When a user sends a private message, you look at the array for the target socket and send it to that specific one. This requires a specific socket identifier. You can use internal socket.id
, but it will be a problem when the client reconnects (a new ID is generated). And there is another problem when your application is running on more than one machine (they cannot share arrays of connected clients).
The second way is to use rooms. Whenever a client connects, I will assume that they have a name like John. Then you can use something like this for your connection:
socket.join('/priv/'+name);
Now this creates a room and adds to it socket
. If you want to send a message to John, you simply use
io.sockets.in('/priv/John').emit('msg', data);
At this point, you can be sure that the message is being sent exactly to the socket in the /priv/John
room. This works great with Redis in combination with socket.io (to avoid a lot of machine issues) and session authorization. I haven't tried it with memoryStore, but it should work as well.
Also you don't have to worry about rooms when clients disconnect. Socket.io destroys empty rooms automatically.
source to share