0

ノードjsで簡単なサーバーを作成しました。

var tls = require("tls"), fs = require("fs"), sys = require("sys");
//Number of messages received
var received=0;

var options = {
    key: fs.readFileSync("certs/keys/server.key"),//Server private key
    cert:fs.readFileSync("certs/certs/server.crt"),//Server cert.
    requestCert: true,//Require client to send it's certificate
    rejectUnauthorized:true,
    ca:fs.readFileSync("certs/certs/userA.crt") //Root certificate,
};


//Server instance with connection request callback
var server = tls.createServer(options,function(socket){ 
    //Add a listener for receiving data packets
    socket.addListener("data", function(data){      
        received++;     
    });
}).listen(2195,function(){
    console.log("Server started");
});

サーバーへの複数(300)の接続を確立してメッセージを送信するJavaクライアントアプリケーションもあります。問題は、変数「received」の値が Java 側の「send」の値と一致しないことです。為に。たとえば、Java アプリケーションから 100,000 件のメッセージを送信すると、すべてのメッセージがサーバーによって正常に受信されたにもかかわらず、サーバーは受信値を 80,000 と表示します。

問題は、受信した変数が複数のコールバックによって同時に更新され、最終的な値が台無しになっていることだと思います。これを解決する方法について何か考えはありますか?

4

1 に答える 1

0

TCP/IP は、送信されたパケットの数が受信されたパケットの数と一致することを保証しません。そのため、2 つ以上の連続して送信されたパケットが 1 つに「結合」されることがあります。(参照 -> Nagle のアルゴリズム) またはMTUに適合しない場合、分割されます (参照 -> IP フラグメンテーション) 。

于 2012-04-19T23:01:27.807 に答える