124 votes

Quel est un exemple de Socket.io le plus simple possible ?

J'ai essayé de comprendre Socket.io ces derniers temps, mais je ne suis pas un super programmeur, et presque tous les exemples que je peux trouver sur le web (croyez-moi, j'ai cherché pendant des heures et des heures), ont des trucs supplémentaires qui compliquent les choses. Beaucoup d'exemples font un tas de choses qui me déroutent, ou se connectent à une base de données bizarre, ou utilisent coffeescript ou des tonnes de bibliothèques JS qui encombrent les choses.

J'aimerais voir un exemple basique et fonctionnel où le serveur envoie simplement un message au client toutes les 10 secondes, indiquant l'heure qu'il est, et où le client écrit ces données sur la page ou lance une alerte, quelque chose de très simple. Ensuite, je peux comprendre les choses à partir de là, ajouter les choses dont j'ai besoin comme les connexions de base de données, etc. Et oui, j'ai vérifié les exemples sur le site de socket.io et ils ne fonctionnent pas pour moi, et je ne comprends pas ce qu'ils font.

162voto

Linus G Thiel Points 18378

Edit : Je pense qu'il est préférable pour tout le monde de consulter l'excellente exemple de chat sur la page de démarrage de Socket.IO. L'API a été assez simplifiée depuis que j'ai fourni cette réponse. Ceci étant dit, voici la réponse originale mise à jour pour l'API plus récente.

Juste parce que je me sens bien aujourd'hui :

index.html

<!doctype html>
<html>
    <head>
        <script src='/socket.io/socket.io.js'></script>
        <script>
            var socket = io();

            socket.on('welcome', function(data) {
                addMessage(data.message);

                // Respond with a message including this clients' id sent from the server
                socket.emit('i am client', {data: 'foo!', id: data.id});
            });
            socket.on('time', function(data) {
                addMessage(data.time);
            });
            socket.on('error', console.error.bind(console));
            socket.on('message', console.log.bind(console));

            function addMessage(message) {
                var text = document.createTextNode(message),
                    el = document.createElement('li'),
                    messages = document.getElementById('messages');

                el.appendChild(text);
                messages.appendChild(el);
            }
        </script>
    </head>
    <body>
        <ul id='messages'></ul>
    </body>
</html>

app.js

var http = require('http'),
    fs = require('fs'),
    // NEVER use a Sync function except at start-up!
    index = fs.readFileSync(__dirname + '/index.html');

// Send index.html to all requests
var app = http.createServer(function(req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(index);
});

// Socket.io server listens to our app
var io = require('socket.io').listen(app);

// Send current time to all connected clients
function sendTime() {
    io.emit('time', { time: new Date().toJSON() });
}

// Send current time every 10 secs
setInterval(sendTime, 10000);

// Emit welcome message on connection
io.on('connection', function(socket) {
    // Use socket to communicate with this particular client only, sending it it's own id
    socket.emit('welcome', { message: 'Welcome!', id: socket.id });

    socket.on('i am client', console.log);
});

app.listen(3000);

37voto

error Points 469

Voici ma soumission !

si vous mettez ce code dans un fichier appelé hello.js et que vous l'exécutez en utilisant node hello.js, le message hello devrait s'afficher, il a été envoyé par 2 sockets.

Le code montre comment gérer les variables d'un message d'accueil rebondissant du client vers le serveur via la section de code intitulée //Mirror.

Les noms des variables sont déclarés localement plutôt que tous en haut car ils ne sont utilisés que dans chacune des sections entre les commentaires. Chacune d'entre elles pourrait se trouver dans un fichier séparé et être exécutée comme son propre nœud.

// Server
var io1 = require('socket.io').listen(8321);

io1.on('connection', function(socket1) {
  socket1.on('bar', function(msg1) {
    console.log(msg1);
  });
});

// Mirror
var ioIn = require('socket.io').listen(8123);
var ioOut = require('socket.io-client');
var socketOut = ioOut.connect('http://localhost:8321');

ioIn.on('connection', function(socketIn) {
  socketIn.on('foo', function(msg) {
    socketOut.emit('bar', msg);
  });
});

// Client
var io2 = require('socket.io-client');
var socket2 = io2.connect('http://localhost:8123');

var msg2 = "hello";
socket2.emit('foo', msg2);

23voto

ray_voelker Points 18

Peut-être que cela peut vous aider aussi. J'avais du mal à comprendre le fonctionnement de socket.io, alors j'ai essayé de résumer un exemple autant que possible.

J'ai adapté cet exemple à partir de l'exemple posté ici : http://socket.io/get-started/chat/

Tout d'abord, commencez dans un répertoire vide, et créez un fichier très simple appelé paquet.json Placez-y les éléments suivants.

{
"dependencies": {}
}

Ensuite, sur la ligne de commande, utilisez npm pour installer les dépendances dont nous avons besoin pour cet exemple

$ npm install --save express socket.io

Cela peut prendre quelques minutes en fonction de la vitesse de votre connexion réseau / CPU / etc. Pour vérifier que tout s'est déroulé comme prévu, vous pouvez consulter l'écran suivant paquet.json de nouveau.

$ cat package.json
{
  "dependencies": {
    "express": "~4.9.8",
    "socket.io": "~1.1.0"
  }
}

Créez un fichier appelé server.js Ce sera évidemment notre serveur exécuté par node. Placez-y le code suivant :

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){

  //send the index.html file for all requests
  res.sendFile(__dirname + '/index.html');

});

http.listen(3001, function(){

  console.log('listening on *:3001');

});

//for testing, we're just going to send data to the client every second
setInterval( function() {

  /*
    our message we want to send to the client: in this case it's just a random
    number that we generate on the server
  */
  var msg = Math.random();
  io.emit('message', msg);
  console.log (msg);

}, 1000);

Créer le dernier fichier appelé index.html et y placer le code suivant.

<html>
<head></head>

<body>
  <div id="message"></div>

  <script src="/socket.io/socket.io.js"></script>
  <script>
    var socket = io();

    socket.on('message', function(msg){
      console.log(msg);
      document.getElementById("message").innerHTML = msg;
    });
  </script>
</body>
</html>

Vous pouvez maintenant tester cet exemple très simple et voir des résultats similaires à ceux qui suivent :

$ node server.js
listening on *:3001
0.9575486415997148
0.7801907607354224
0.665313188219443
0.8101786421611905
0.890920243691653

Si vous ouvrez un navigateur Web et le faites pointer vers le nom d'hôte sur lequel vous exécutez le processus de nœud, vous devriez voir les mêmes chiffres apparaître dans votre navigateur, ainsi que dans tout autre navigateur connecté qui regarde la même page.

11voto

edwardsmarkf Points 562

Je me rends compte que cet article date de plusieurs années maintenant, mais parfois les débutants certifiés comme moi ont besoin d'un exemple de travail qui est totalement dépouillé jusqu'à la forme la plus simple.

tous les exemples simples de socket.io que j'ai pu trouver impliquaient http.createServer(). mais que faire si vous voulez inclure un peu de magie de socket.io dans une page web existante ? voici l'exemple le plus simple et le plus petit que j'ai pu trouver.

ceci renvoie simplement une chaîne de caractères passée par la console en majuscules.

app.js

var http = require('http');

var app = http.createServer(function(req, res) {
        console.log('createServer');
});
app.listen(3000);

var io = require('socket.io').listen(app);

io.on('connection', function(socket) {
    io.emit('Server 2 Client Message', 'Welcome!' );

    socket.on('Client 2 Server Message', function(message)      {
        console.log(message);
        io.emit('Server 2 Client Message', message.toUpperCase() );     //upcase it
    });

});

index.html :

<!doctype html>
<html>
    <head>
        <script type='text/javascript' src='http://localhost:3000/socket.io/socket.io.js'></script>
        <script type='text/javascript'>
                var socket = io.connect(':3000');
                 // optionally use io('http://localhost:3000');
                 // but make *SURE* it matches the jScript src
                socket.on ('Server 2 Client Message',
                     function(messageFromServer)       {
                        console.log ('server said: ' + messageFromServer);
                     });

        </script>
    </head>
    <body>
        <h5>Worlds smallest Socket.io example to uppercase strings</h5>
        <p>
        <a href='#' onClick="javascript:socket.emit('Client 2 Server Message', 'return UPPERCASED in the console');">return UPPERCASED in the console</a>
                <br />
                socket.emit('Client 2 Server Message', 'try cut/paste this command in your console!');
        </p>
    </body>
</html>

pour courir :

npm init;  // accept defaults
npm  install  socket.io  http  --save ;
node app.js  &

utilisez quelque chose comme ceci test de port pour s'assurer que votre port est ouvert.

naviguez maintenant vers http://localhost/index.html et utilisez la console de votre navigateur pour renvoyer des messages au serveur.

au mieux, lorsque vous utilisez http.createServer, il modifie les deux lignes suivantes pour vous :

<script type='text/javascript' src='/socket.io/socket.io.js'></script>
var socket = io();

j'espère que cet exemple très simple épargnera à mes collègues débutants quelques difficultés. et remarquez que j'ai évité d'utiliser des noms de variables définies par l'utilisateur ressemblant à des "mots réservés" pour mes définitions de socket.

4voto

Vishal Thakur Points 526

index.html

<!doctype html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
      #messages { margin-bottom: 40px }
    </style>
  </head>
  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
    <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
      $(function () {
        var socket = io();
        $('form').submit(function(){
          socket.emit('chat message', $('#m').val());
          $('#m').val('');
          return false;
        });
        socket.on('chat message', function(msg){
          $('#messages').append($('<li>').text(msg));
          window.scrollTo(0, document.body.scrollHeight);
        });
      });
    </script>
  </body>
</html>

index.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 3000;

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    io.emit('chat message', msg);
  });
});

http.listen(port, function(){
  console.log('listening on *:' + port);
});

Et Exécutez ces commandes pour exécuter l'application.

npm init;  // accept defaults
npm  install  socket.io  http  --save ;
node start

et ouvrez l'URL:- http://127.0.0.1:3000/ Le port peut être différent. et vous verrez ceci SORTIE

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X