I have this Node.JS server:
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var i;
/**
* Gestion des requêtes HTTP des utilisateurs en leur renvoyant les fichiers du dossier 'public'
*/
app.use('/', express.static(__dirname + '/public'));
/**
* Liste des utilisateurs connectés
*/
var users = [];
/**
* Historique des messages
*/
var messages = [];
/**
* Liste des utilisateurs en train de saisir un message
*/
var typingUsers = [];
io.on('connection', function (socket) {
/**
* Utilisateur connecté à la socket
*/
var loggedUser;
/**
* Emission d'un événement "user-login" pour chaque utilisateur connecté
*/
for (i = 0; i < users.length; i++) {
socket.emit('user-login', users[i]);
}
/**
* Emission d'un événement "chat-message" pour chaque message de l'historique
*/
for (i = 0; i < messages.length; i++) {
if (messages[i].type === 'chat-message') {
socket.emit('chat-message', messages[i]);
} else {
socket.emit('service-message', messages[i]);
}
}
/**
* Déconnexion d'un utilisateur
*/
socket.on('disconnect', function () {
if (loggedUser !== undefined) {
// Broadcast d'un 'service-message'
var serviceMessage = {
text: 'User "' + loggedUser.username + '" disconnected',
type: 'logout'
};
socket.broadcast.emit('service-message', serviceMessage);
// Suppression de la liste des connectés
var userIndex = users.indexOf(loggedUser);
if (userIndex !== -1) {
users.splice(userIndex, 1);
}
// Ajout du message à l'historique
messages.push(serviceMessage);
// Emission d'un 'user-logout' contenant le user
io.emit('user-logout', loggedUser);
// Si jamais il était en train de saisir un texte, on l'enlève de la liste
var typingUserIndex = typingUsers.indexOf(loggedUser);
if (typingUserIndex !== -1) {
typingUsers.splice(typingUserIndex, 1);
}
}
});
/**
* Connexion d'un utilisateur via le formulaire :
*/
socket.on('user-login', function (user, callback) {
// Vérification que l'utilisateur n'existe pas
var userIndex = -1;
for (i = 0; i < users.length; i++) {
if (users[i].username === user.username) {
userIndex = i;
}
}
if (user !== undefined && userIndex === -1) { // S'il est bien nouveau
// Sauvegarde de l'utilisateur et ajout à la liste des connectés
loggedUser = user;
users.push(loggedUser);
// Envoi et sauvegarde des messages de service
var userServiceMessage = {
text: 'You logged in as "' + loggedUser.username + '"',
type: 'login'
};
var broadcastedServiceMessage = {
text: 'User "' + loggedUser.username + '" logged in',
type: 'login'
};
socket.emit('service-message', userServiceMessage);
socket.broadcast.emit('service-message', broadcastedServiceMessage);
messages.push(broadcastedServiceMessage);
// Emission de 'user-login' et appel du callback
io.emit('user-login', loggedUser);
callback(true);
} else {
callback(false);
}
});
/**
* Réception de l'événement 'chat-message' et réémission vers tous les utilisateurs
*/
socket.on('chat-message', function (message) {
// On ajoute le username au message et on émet l'événement
message.username = loggedUser.username;
// On assigne le type "message" à l'objet
message.type = 'chat-message';
io.emit('chat-message', message);
// Sauvegarde du message
messages.push(message);
if (messages.length > 150) {
messages.splice(0, 1);
}
});
/**
* Réception de l'événement 'start-typing'
* L'utilisateur commence à saisir son message
*/
socket.on('start-typing', function () {
// Ajout du user à la liste des utilisateurs en cours de saisie
if (typingUsers.indexOf(loggedUser) === -1) {
typingUsers.push(loggedUser);
}
io.emit('update-typing', typingUsers);
});
/**
* Réception de l'événement 'stop-typing'
* L'utilisateur a arrêter de saisir son message
*/
socket.on('stop-typing', function () {
var typingUserIndex = typingUsers.indexOf(loggedUser);
if (typingUserIndex !== -1) {
typingUsers.splice(typingUserIndex, 1);
}
io.emit('update-typing', typingUsers);
});
});
/**
* Lancement du serveur en écoutant les connexions arrivant sur le port 3000
*/
http.listen(3000);
client
*global io, rivets, utils*/
/*jslint browser: true*/
var socket = io();
var i, j;
/**
* Liste des messages
*/
var messages = [];
/**
* Liste des utilisateurs
*/
var users = [];
/*** DataBinding initial ***/
rivets.bind($('#messages'), { messages : messages });
rivets.bind($('#users'), { users : users });
/*** Gestion des événements ***/
/**
* Connexion de l'utilisateur
* Uniquement si le username n'est pas vide et n'existe pas encore
*/
$('#login form').submit(function (e) {
e.preventDefault();
var user = {
username : $('#login input').val().trim()
};
if (user.username.length > 0) { // Si le champ de connexion n'est pas vide
socket.emit('user-login', user, function (success) {
if (success) {
$('body').removeAttr('id'); // Cache formulaire de connexion
$('#chat input').focus(); // Focus sur le champ du message
}
});
}
});
/**
* Envoi d'un message
*/
$('#chat form').submit(function (e) {
e.preventDefault();
var message = {
text : $('#m').val()
};
$('#m').val('');
if (message.text.trim().length !== 0) { // Gestion message vide
socket.emit('chat-message', message);
}
$('#chat input').focus(); // Focus sur le champ du message
});
/**
* Réception d'un message
*/
socket.on('chat-message', function (message) {
message.label = message.username;
messages.push(message);
utils.scrollToBottom();
});
/**
* Réception d'un message de service
*/
socket.on('service-message', function (message) {
message.label = 'information';
messages.push(message);
utils.scrollToBottom();
});
/**
* Connexion d'un nouvel utilisateur
*/
socket.on('user-login', function (user) {
users.push(user);
setTimeout(function () {
$('#users li.new').removeClass('new');
}, 1000);
});
/**
* Déconnexion d'un utilisateur
*/
socket.on('user-logout', function (user) {
var userIndex = users.indexOf(user);
if (userIndex !== -1) {
users.splice(userIndex, 1);
}
});
/**
* Détection saisie utilisateur
*/
var typingTimer;
var isTyping = false;
$('#m').keypress(function () {
clearTimeout(typingTimer);
if (!isTyping) {
socket.emit('start-typing');
isTyping = true;
}
});
$('#m').keyup(function () {
clearTimeout(typingTimer);
typingTimer = setTimeout(function () {
if (isTyping) {
socket.emit('stop-typing');
isTyping = false;
}
}, 500);
});
/**
* Gestion saisie des autres utilisateurs
*/
socket.on('update-typing', function (typingUsers) {
for (i = 0; i < users.length; i++) {
users[i].typing = false;
}
for (i = 0; i < typingUsers.length; i++) {
for (j = 0; j < users.length; j++) {
if (typingUsers[i].username === users[j].username) {
users[j].typing = true;
break;
}
}
}
});
https://github.com/BenjaminBini/socket.io-chat.git i like to connect to computer but The problem is that it seems to be only working locally. Any idea on what the problem might be?
via Mohamed Zaouali
No comments:
Post a Comment