Maison  >  Article  >  interface Web  >  Explication détaillée du serveur TCP Nodejs et du programme de discussion client

Explication détaillée du serveur TCP Nodejs et du programme de discussion client

零下一度
零下一度original
2017-07-09 09:44:321222parcourir

Cet article présente principalement en détail les programmes de chat serveur et client TCP de Nodejs. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

TCP est utilisé pour les ordinateurs en écrivant le code pour communiquer entre eux. le client et le serveur, j'ai une compréhension approfondie des étapes de travail du serveur et du client. Ici, je vais le résumer en m'appuyant sur le grand livre Node.js.

Le programme de chat TCP doit utiliser le module net dans Nodejs. Le module net est une encapsulation de TCP et est utilisé pour créer des serveurs et des clients TCP.

Côté serveur

compte : le nombre de clients connectés
utilisateurs : un objet utilisé pour stocker les pseudonymes des utilisateurs clients, les valeurs des objets ; sont tous C'est le Socket du client. Socket est une interface utilisée pour la communication entre le serveur et le client.
net.createServer : est utilisé pour créer un serveur TCP. La fonction passée est l'écouteur de l'événement de connexion L'événement de connexion est déclenché après la connexion d'un client au serveur. est un socket , c'est-à-dire une instance de net.Socket, qui est à la fois lisible et inscriptible. conn : C'est le paramètre
de la fonction de rappel Le conn correspondant à chaque client est différent, et le serveur l'identifiera automatiquement. conn.write : envoie des données au client.
pseudo : C'est le pseudo du client. Lorsque le pseudo n'est pas défini, cela signifie que le client n'a pas encore saisi le pseudo et doit saisir le pseudo pour vérification. S'il n'est pas vide, il a été stocké. signifie que les données d'entrée sont une conversation et doivent être affichées aux autres sur le client.
conn.on('data',function (data){...}) : est utilisé pour recevoir des données du client.


  /*server.js*/
  var net=require('net');
  var count=0;
  var users={};
  
  var server=net.createServer(function (conn) {
    conn.setEncoding('utf8');
    conn.write(count+' people are connected'
      +'\nplease write your nickname:');
    count++;
    var nickname;
    conn.on('data',function (data) {
      data=data.replace(/\r\n/,'');
      if(!nickname){
        if(users[data]){
          conn.write('\n nickname already used,try again:');
          return;
        }else {
          nickname=data;
          users[nickname]=conn;//每个客户端对应的conn是不一样的
          for(var i in users){
            users[i].write(nickname+' join the romm\n');
          }
        }
      }else {
        conn.write('发送者nickname: '+nickname+'\n');
        for(var i in users){
          if(i!=nickname){
            users[i].write(nickname+': '+data+'\n');
          }
        }
      }
    });
    conn.on('close',function () {//这里防止连接出错,使用close而非end
      console.log(nickname+' client disconnected\n');
      count--;
      delete users[nickname];
    });
    conn.on('error',function (err) {
      console.log('Error in connection:'+ err+'\n');
    });
  }).listen(3000,function () {
    console.log('server is listenning on 3000');
  });

Client

process.stdin.resume() : flux process.stdin pour accepter le clavier de l'utilisateur entrée, ce flux lisible est dans un état de pause lors de son initialisation et la méthode CV sur le flux est appelée pour reprendre le flux.

process.stdin.on('data', function(data){…}) : est utilisé pour obtenir une saisie au clavier et l'envoyer au serveur à l'aide de client.write().
stop : permet de déterminer si le client est déconnecté normalement.
net.createConnection : est utilisé pour créer une connexion côté serveur et ajoute automatiquement un écouteur à l'événement de connexion. L'écouteur ne reçoit pas de paramètres. Ce qui est renvoyé est « net.Socket ».


  /*client.js*/
  var net=require('net');
  var stop = false;
  process.stdin.resume(); 
  
  process.stdin.on('data', function(data){
    if(data.toString().trim().toLowerCase()==='stop'){
      stop=true;
      console.log('connection stop\n');
      client.end();
    }else{
      client.write(data);
    }
  });
  
  var client=net.createConnection(3000,function () {
    console.log('connected to server!\n');
  });
  client.on('data', function(data) {
    console.log(data.toString());//打印服务器发送的数据
  });
  client.on('error', function(err) {
    console.log('Error in connection:'+ err+'\n');
  });
  client.on('close', function() {
    if(! stop) {
      console.log('connection got closed');
    }
  });

Programme de discussion TCP

Voici les résultats des tests exécutés dans git et connectant 3 clients :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn