Bonjour à tous les Geeks. Je viens de tester le framework socket.io en locale en creant un petit forum de chat direct, et il fonctionne très bien. Mais je n'arrive pas à le faire marcher en ligne sur un site web. Le fait est que en locale, j'accede au socket à l'aide d'un serveur virtuel que j'active en commande (node server), à l'adresse localhost:3000, voici mon code:
server.js
var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
users=[];
connections=[];
app.listen(3000);
console.log("Serveur en cours...");
//me redirige vers une page index.html
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
connections.push(socket);
console.log('connected: %s sockets connectes', connections.length);
//Deconnectes
socket.on('disconnect',function(data){
connections.splice(connections.indexOf(socket),1);
console.log('Deconnectes: %s sockets deconnectes', connections.length);
});
//Envois message
socket.on('send message',function(data){
console.log(data);
io.sockets.emit('new message', {msg:data});
});
});
Ma page html
<!DOCTYPE html>
<html>
<head>
<title>Chat direct</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.3.0/css/foundation.min.css">
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<div class="row" style="margin-top: 115px">
<div class="large-3 columns">
<div class="callout panel">
<h3>Personnes en lignes</h3>
<ul>
</ul>
</div>
</div>
<div class="large-9 columns">
<div class="chat" id="chat"></div>
<div class="callout panel">
<form id="messageform">
<div>
<label>Enter Message</label>
<textarea class="" id="message"></textarea>
<br>
<input type="submit" class="tiny button" value="Envoyer"></input>
</div>
</form>
</div>
</div>
</div>
<script>
$(function(){
var socket=io.connect();
var messageform=$('#messageform');
var message=$('#message');
var chat=$('#chat');
messageform.submit(function(e){
e.preventDefault();
socket.emit('send message', message.val());
message.val();
});
socket.on('new message', function(data){
chat.append('<div class="callout panel">'+data.msg+'</div>');
})
} )
</script>
</body>
</html>
Quelqu'un aurait-il une idée de pourquoi il ne fonctionne pas une fois herbergé sur un site web?
Salut,
Bon, allez, on passe sur le fait que tu importes 3 bonnes grosses libs alors que tu n'as besoin d'aucune des trois (et dans le header pour les libs JS, en plus). :)
Sinon, comme l'a dit @betaWeb, sans logs, on ne peut pas vraiment t'aider. Des connections s'ouvrent ?
Aussi, formatter ton code correctement t'aidera à voir si c'est un problème de syntaxe et permet de distinguer les blocks plus facilement.
L'erreur qu'on me renvoit en console c'est:http://monsite.com/socket.io/?EIO=3&transport=polling&t=LeL57vY 403 (Forbidden)
J'ai tenté de deplacé le dossier socket.io dans la racine de mon site, ça me renvoit toujours la même erreur
C'est bizarre ; tu utilises quoi comme navigateur ? On dirait que socket.io fallback sur du long-polling.
C'est la même chose dans Mozilla que dans Chrome. Sur Mozilla on me dit: You don't have permission to access /socket.io/aroundon this server.
Tu es sur un serveur mutualisé ? Peut être que les connexions WS sont bloquées par l'hébergeur ? Ou tout simplement que le port 3000 est un port réservé ;)
Après quelques modifications j'obient ce message en console require is not defined
, à la ligne 1 de mo fichier server.js:
<script> var http = require('http'); </script>
Je sais d'où vient le problème (peut-etre). Dans mon projet j'ai un dossier node_module
qui contient les dependances socket io, mais je ne sais pas comment l'injecter dans mon script pour qu'il soit accessible en ligne. J'ai essayé avec <php require "node_modules"
mais en vain. Quelqu'un a-t-il une idée?
Mais, ce server.js
, tu l'exécutes bien avec node.js ? Et il n'y a pas de balise <script>
dedans, si ?