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_
Auteur

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

Salut,

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

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_
Auteur

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.

Anthony_
Auteur

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

Anthony_
Auteur

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 ?