2015-08-08 2 views
0

im essayant de construire serveur TCP/client de messagerie instantanée mon code à ce jour estclients tcp communication serveur

server.js

var net=require("net"); 
var sockets=[]; 
var server=net.createServer(function(socket){ 
    console.log("new socket connected"); 
    sockets.push(socket); 
    var sh=""; 
    socket.on("data",function(data){ 
     sh=sh+data; 
    }); 
    socket.on("end",function(){ 
     sockets.forEach(function(x){ 
      if(x!==socket){ 
       x.write("Dakto poveda :"+ sh); 
       sh=""; 
      } 
     }); 
    }) 
    socket.on("close",function(){ 
     console.log("Connection closed") 
    }) 
}).listen(8888) 

et Client.js

var net=require("net"); 
var client= new net.Socket(); 
client.connect(8888,function(){ 
    console.log("Conncted"); 
    client.write("Hello from client") 
}); 
client.on("data",function(data){ 
    console.log("data "+data) 
}); 
client.on("close",function(){ 
    console.log("Client closed"); 
    client.write("client closed") 
}) 

je commence serveur .js puis j'ouvre de nouveaux cmds et démarre client.js dedans. Dans le serveur cmd dans les écritures ce client a connecté, et dans le client cmd il écrit "connecté" et il n'écrit pas "bonjour du client" + la question est, comment puis-je communiquer entre ces clients/serveur? Lorsque je démarre ces fichiers, je ne peux plus écrire sur cmd

Répondre

1

Actuellement votre code serveur attend que le client se déconnecte avant d'afficher les données mises en mémoire tampon sur stdout. Si vous voulez l'afficher immédiatement, vous devrez utiliser un certain type de protocole de cadrage afin que vous sachiez quand un "message" commence et se termine. Une méthode courante consiste à utiliser des messages JSON délimités par des lignes. Par exemple:

server.js:

var net = require('net'); 
var sockets = []; 
function broadcast(from, msg) { 
    msg = JSON.stringify('Dakto poveda: ' + msg) + '\n'; 
    sockets.forEach(function(x) { 
    if (x !== from) 
     x.write(msg); 
    }); 
} 
var server = net.createServer(function(socket){ 
    sockets.push(socket); 

    var buffer = ''; 
    socket.on('data',function(data) { 
    buffer += data; 
    var idx; 
    while ((idx = buffer.indexOf('\n')) > -1) { 
     broadcast(socket, JSON.parse(buffer.slice(0, idx))); 
     buffer = buffer.slice(idx + 1); 
    } 
    }); 

    socket.on('close',function() { 
    // Remove dead socket from list 
    sockets.splice(sockets.indexOf(socket), 1); 

    console.log('Connection closed') 
    }); 
}).listen(8888); 

client.js:

var net = require('net'); 
var client = new net.Socket(); 
function send(msg) { 
    client.write(JSON.stringify(msg) + '\n'); 
} 
client.connect(8888, function() { 
    console.log('Conncted'); 
    send('Hello from client'); 
}); 
var buffer = ''; 
client.on('data', function(data) { 
    buffer += data; 
    var idx; 
    while ((idx = buffer.indexOf('\n')) > -1) { 
    console.log('message received: ' + JSON.parse(buffer.slice(0, idx))); 
    buffer = buffer.slice(idx + 1); 
    } 
}); 
client.on('close',function(){ 
    console.log('Client closed'); 
}); 

La conversion JSON peut être utile si vous souhaitez intégrer les nouvelles lignes et comme dans vos messages, qui autrement gâcher votre message encadrement. Un autre avantage est que vous pouvez envoyer des objets JavaScript, des tableaux, etc. au lieu de simples chaînes de caractères. Cela vous permettrait de transmettre différents types de données plus facilement.

+0

cela a vraiment aidé, mais pour la dernière question, pourquoi je ne peux pas écrire dans le cmd après avoir commencé cliend? sans cela je suis limité à des messages statiques (ofc je pourrais envoyer des données de bout en bout, mais im juste en commençant par node donc je vais essayer ça plus tard) – Darlyn

+1

@trolkura Il n'y a pas de réponse unique à cette question. Tout dépend de l'application. Par exemple, si vous faites simplement une chose basée sur la console qui fonctionne dans le terminal, alors vous devriez simplement lire stdin et envoyer le message lorsque l'utilisateur appuie sur Entrée. Ou peut-être que vous avez vos commandes/entrées proviennent d'un canal redis pubsub. Tout dépend. – mscdex