2011-09-06 156 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