2013-06-26 11 views
5

Ben etrafta arama yaptım ve cevaplamaya çalıştığım tam bir soru bulamıyorum veya bana açıklayacak birine ihtiyacım var Temel olarak, Net kütüphanesini kullanan bir Node.js betiğim var. Birden çok ana bilgisayara bağlanıyorum ve komut gönderiyorum ve dönüş verilerini dinliyorum.Node.js net kütüphanesi: 'data' olayından tüm verileri alma

var net = require('net'); 

var nodes = [ 
    'HOST1,192.168.179.8', 
    'HOST2,192.168.179.9', 
    'HOST3,192.168.179.10', 
    'HOST4,192.168.179.11' 
]; 

function connectToServer(tid, ip) { 
    var conn = net.createConnection(23, ip); 
    conn.on('connect', function() { 
     conn.write (login_string); // login string hidden in pretend variable 
    }); 
    conn.on('data', function(data) { 
     var read = data.toString(); 
     if (read.match(/Login Successful/)) { 
      console.log ("Connected to " + ip); 
      conn.write(command_string); 
     } 

     else if (read.match(/Command OK/)) { // command_string returned successful, 
                // read until /\r\nEND\r\n/ 

        // First part of data comes in here 
      console.log("Got a response from " + ip + ':' + read); 
     } 
     else { 
       //rest of data comes in here 
      console.log("Atonomous message from " + ip + ':' + read); 
     } 
    }); 
    conn.on('end', function() { 
     console.log("Lost conncection to " + ip + "!!"); 
    }); 
    conn.on('error', function(err) { 
     console.log("Connection error: " + err + " for ip " + ip); 
    }); 
} 

nodes.forEach(function(node) { 
    var nodeinfo = node.split(","); 
    connectToServer(nodeinfo[0], nodeinfo[1]); 
}); 

Veriler iki parçaya bölünmüş olarak biter. Verileri bir karede saklasam ve ilk bölümü/\ r \ nEND \ r \ n/sınırlayıcısını okuduğumda kalan kısmı eklesem bile ortada bir eksik eksik var. Komple iletiyi akıştan aldığımdan emin olmak için verileri düzgün bir şekilde nasıl yedeklerim?

DÜZENLEME: Tamam, bu daha iyi çalışıyor gibi görünüyor:

function connectToServer(tid, ip) { 
     var conn = net.createConnection(23, ip); 

     var completeData = ''; 

     conn.on('connect', function() { 
       conn.write (login_string); 
     }); 
     conn.on('data', function(data) { 
       var read = data.toString(); 

       if (read.match(/Login Successful/)) { 
         console.log ("Connected to " + ip); 

         conn.write(command_string); 
       } 
       else { 
         completeData += read; 
       } 

       if (completeData.match(/Command OK/)) { 
         if (completeData.match(/\r\nEND\r\n/)) { 
           console.log("Response: " + completeData); 
         } 
       } 
     }); 
     conn.on('end', function() { 
       console.log("Connection closed to " + ip); 
     }); 
     conn.on('error', function(err) { 
       console.log("Connection error: " + err + " for ip " + ip); 
     }); 
} 

Benim en büyük sorunu olasılıkla bir mantık hatası oldu. Ya cevap başlatan öbekleri ya da onu bitiren yığınları bekliyordum. Aradaki her şeyi kurtarmıyordum.

Eğer tüm Node-ish'ları bu konuda almak istiyorsam, tam bir mesaj geldiğinde (boş satırdan başlayarak, bir satırda "END" ile biten) bir olayı tetiklemeliyim. orada işleniyor.

+0

Bir parçanın eksik olduğunu nasıl tespit ediyorsunuz? Konsolda oturum açan hata ayıklama mesajlarından mı? –

+0

manuel olarak yapılarak yan yana karşılaştırma. –

cevap

1

Sorunum bir mantık sorun oldu. Ya mesajı başlatan öbekleri ya da mesajı sonlandıran ve aradaki her şeyi görmezden gelen şeyi arıyordum. Sanırım cevabın tamamının bir veya iki parça halinde gelmesi bekleniyor.

Yukarıdaki kod, çalışma geçmişini yapıştırdı. Muhtemelen daha çok Node-ish yöntemi var (her bilgi için bir olay çıkarmalıyım), fakat yarın bu zamana kadar daha iyi bir sürüm yayınlamadığı sürece bunu cevap olarak işaretleyeceğim.

function connectToServer(tid, ip) { 
     var conn = net.createConnection(23, ip); 

     var completeData = ''; 

     conn.on('connect', function() { 
       conn.write (login_string); 
     }); 
     conn.on('data', function(data) { 
       var read = data.toString(); 

       if (read.match(/Login Successful/)) { 
         console.log ("Connected to " + ip); 

         conn.write(command_string); 
       } 
       else { 
         completeData += read; 
       } 

       if (completeData.match(/Command OK/)) { 
         if (completeData.match(/\r\nEND\r\n/)) { 
           console.log("Response: " + completeData); 
         } 
       } 
     }); 
     conn.on('end', function() { 
       console.log("Connection closed to " + ip); 
     }); 
     conn.on('error', function(err) { 
       console.log("Connection error: " + err + " for ip " + ip); 
     }); 
} 
3

Son olayı alana kadar elde ettiğiniz verilerle hiçbir şey yapmamalısınız. Son geri dönüş, tüm veri parçalarının akıştan geri çağrılarınıza gönderildiği anlamına gelir. Veriler birden fazla yığın halinde geliyorsa, bu verileri saklamak için işlev kapanışınızda bir değişken oluşturmanız gerekir. Çoğu program, bu gerçeği göz ardı ederek gayet iyi çalışabilir, çünkü veri genellikle bir yığınla karşılaşır. Ama bazen değil. Mutlaka veri miktarına bağlı değildir. Bunun olduğu bir durumdaysanız, bunun nasıl ele alınacağını gösteren bir örnek oluşturdum. Temel olarak kodunuzu kullandım, ancak tüm tüyleri temizledim ... bu sadece tüm verileri toplamanız ve üzerinde çalışmanız gereken mantığı göstermektir.

function connectToServer(tid, ip) { 
    var conn = net.createConnection(23, ip); 
    var completeData = ''; 

    conn.on('connect', function() { 
     conn.write (login_string); // login string hidden in pretend variable 
    }); 
    conn.on('data', function(data) { 
     completeData += data; 
     var dataArray = completeData.split('your delimiter'); 
     if(dataArray.size > 1) { //If our data was split into several pieces, we have a complete chunk saved in the 0th position in the array 
      doWorkOnTheFirstHalfOfData(dataArray[0]); 
      completeData = dataArray[1];// The second portion of data may yet be incomplete, thise may need to be more complete logic if you can get more than one delimeter at a time... 
     } 
    }); 
    conn.on('end', function() { 
     //do stuff with the "completeData" variable in here. 
    }); 
} 
+0

+1 Karma ile yaptığı şey bu gibi görünse de, basit bir yerel değişkeni olan bu kod, aynı şeyi yapmak için çok daha basit (ve daha kolay hata ayıklama) yoludur. –

+0

@JoachimIsaksson - Tek değişkenli yaklaşımın çok daha iyi olduğunu kabul ediyorum, sadece bu değişkenin kapsamını anlayabilmem için çok sayıda cihaz üzerinde çalışıyorum. –

+0

Sanırım 'son' olayını anlamıyorum. Yukarıdaki kod gibi görünecek şekilde kodumu düzenlediğimde, asla bir 'sonuç' olayı göremiyorum. Hala bağlıysam bunu anlayacağım mı? –