2011-09-06 136 views
3

我有我的服務器上運行以下的node.js:的Node.js:發送消息至服務器

var net=require('net'); 
var util=require('util'); 

var server=net.createServer(function(conn){ 
    conn.on('connect',function(){ 
     util.puts('connect'); 
    }); 
    conn.on('data',function(data){ 
     util.puts(data); 
    }); 
}); 
server.listen(5000,'172.16.1.197'); 

這一切正常,我可以telnet到172.16.1.197:5000和它的行爲預期。

現在,我有一個客戶端在IP地址爲172.16.1.218的另一個盒子上運行,我只是想發送一條消息到服務器。

function sendAMessage(payLoad){ 
    //what to put in here? 
} 

payLoad應打印在服務器端。

我知道這看起來很簡單,但我真的無法繞過它 - 我對node.js很陌生。

很多感謝,


添加一些代碼:

這裏的客戶端(172.16.1.218):

var http = require('http'); 
var util=require('util'); 
var net=require('net'); 

var localHash={}; 
var chunkLength=100; 

http.createServer(function(request, response) { 
    var proxy = http.createClient(80, request.headers['host']) 
    var proxy_request = proxy.request(request.method, request.url, request.headers); 
    proxy_request.addListener('response', function (proxy_response) { 
     proxy_response.addListener('data', function(x) { 
      var responseData=x.toString("binary"); 
      var bytes=getBytes(responseData); 
      util.puts(bytes.length); 
      for(var i=0;i<bytes.length;i++){ 
       var hash=DJBHash(bytes[i]); 
       //util.puts(hash); 
       if(hash in localHash){ 
        //in hash, send alias 
        //response.write("<EOH>"+hash+"</EOH>",'binary'); 
        response.write(bytes[i],'binary'); 
       }else{ 
        //not in hash, send full chunk 
        updateRemoteHash(hash,bytes[i]); 
        response.write(bytes[i],'binary'); 
        localHash[hash]=bytes[i]; 

       } 

      } 
      //response.write(bytes,"binary"); 
     }); 
     proxy_response.addListener('end', function() { 
      response.end(); 
     }); 
     response.writeHead(proxy_response.statusCode, proxy_response.headers); 
    }); 
    request.addListener('data', function(chunk) { 
     util.puts(chunk); 
     proxy_request.write(chunk, 'binary'); 
    }); 
    request.addListener('end', function() { 
     proxy_request.end(); 
    }); 
}).listen(8080,'172.16.1.218'); 


function getBytes(responseData){ 
    var f=chunkLength; 
    var toTransmit=""; 
    var p=0; 
    var bytes=Array();  

    var N=responseData.length; 
    if(N>f){ 
     p=Math.floor(N/f); 

     var hash=""; 
     var chunk=""; 
     for(var i=0;i<p;i++){ 
      chunk=responseData.substr(f*i,f); 
      toTransmit=toTransmit+chunk; 
      bytes[i]=chunk; 
      /*hash=DJBHash(chunk); 
      if(localHash[hash]==undefined){ 
       localHash[hash]=chunk; 
       //updateRemoteHash(hash,chunk); 
       toTransmit=toTransmit+chunk; 
      }else{ 
       sys.puts("***hit"+chunk); 
       toTransmit=toTransmit+chunk;//"***EOH"+hash; 
      }*/ 
     } 
     //remainder: 
     chunk=responseData.substr(f*p); 
     toTransmit=toTransmit+chunk; 
     bytes[p]=chunk; 
     /*hash=DJBHash(chunk); 
     if(localHash[hash]==undefined){ 
      localHash[hash]=chunk; 
      //updateRemoteHash(hash,chunk); 
      toTransmit=toTransmit+chunk; 
     }else{ 
      toTransmit=toTransmit+chunk;//"***EOH"+hash; 
     }*/ 
    }else{ 
     toTransmit=responseData; 
     bytes[0]=responseData; 
    } 
    return bytes; 
} 
function DJBHash(str) { 
    var hash = 5381; 
    for(var i = 0; i < str.length; i++) { 
     hash = (((hash << 5) + hash) + str.charCodeAt(i)) & 0xffffffff; 
    } 
    if(hash<-1){ 
     hash=hash*-1; 
    } 
    return hash; 
} 

function updateRemoteHash(hash,chunk){ 
    var c=net.createConnection(5000,'172.16.1.197'); 
    c.on('connect',function(){ 
     c.write(hash); 
     c.end(); 
    }); 
} 

和服務器端(172.16.1.197) :

var net=require('net'); 
var util=require('util'); 

var server=net.createServer(function(conn){ 
    conn.on('connect',function(){ 
     util.puts('connect'); 
    }); 
    conn.on('data',function(data){ 
     util.puts(data); 
    }); 
}); 
server.listen(5000,'172.16.1.197'); 

回答

5

您已使用net.createServer設置TCP服務器。您現在需要使用net.createConnection連接到TCP服務器。

function sendAMessage(msg) { 
    var c = net.createConnection(5000, '172.16.1.218'); 
    c.on("connect", function() { 
    // connected to TCP server. 
    c.write(msg); 
    }); 
} 
+0

嗨,非常感謝您的答覆。我只是在午飯之前整理出一些其他的bug。我會盡快與您聯繫,通知您是否有效。雖然看起來不錯。 – Eamorr

+0

嗨,我有一個問題:'節點:../src/stream_wrap.cc:220:靜態V8 ::處理節點:: StreamWrap ::寫(const v8 :: Arguments&):斷言'Buffer :: HasInstance( args [0])'失敗。 Aborted'我嘗試寫入端口5000,IP地址172.16.1.197 – Eamorr

+1

@Eamorr在連接事件發生之前您是否向端口寫入數據? – Raynos