Implementer Web Socket en ligne

Par Anthony_, il y a 9 ans


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?

9 réponses

Anthony_, il y a 9 ans

IL n y a aucune âme charitable pour me repondre?

betaWeb, il y a 9 ans

Salut,

Tu n'as aucune erreur dans ta console de developpement ? Et dans tes logs NodeJS ?

tleb, il y a 9 ans

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.

Anthony_, il y a 9 ans

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

tleb, il y a 9 ans

C'est bizarre ; tu utilises quoi comme navigateur ? On dirait que socket.io fallback sur du long-polling.

Anthony_, il y a 9 ans

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.

betaWeb, il y a 9 ans

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é ;)

Anthony_, il y a 9 ans

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?

tleb, il y a 9 ans

Mais, ce server.js, tu l'exécutes bien avec node.js ? Et il n'y a pas de balise <script> dedans, si ?