【问题标题】:Node.js: send message to serverNode.js:向服务器发送消息
【发布时间】:2011-09-06 11:12:36
【问题描述】:

我的服务器上正在运行以下 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');

这很好用,我可以远程登录到 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');

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    您已使用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);
      });
    }
    

    【讨论】:

    • 您好,非常感谢您的回复。我只是在午餐前整理出一些其他的错误。我会回复你,让你知道它是否有效。不过看起来不错。
    • 嗨,我遇到了一个问题:node: ../src/stream_wrap.cc:220: static v8::Handle&lt;v8::Value&gt; node::StreamWrap::Write(const v8::Arguments&amp;): Assertion Buffer::HasInstance(args[0])' 失败。 Aborted` 我尝试写入端口 5000,ip 地址 172.16.1.197
    • @Eamorr 在连接事件发生之前你写到端口了吗?
    • 它正在连接到服务器,因为服务器将“连接”写入控制台。但它永远不会获取数据。我应该如何防止它在连接之前写入?非常感谢您的帮助,
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2016-09-29
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2014-03-16
    • 2015-01-05
    相关资源
    最近更新 更多