したがって、次のコードhttps://gist.github.com/tedmiston/5935757の例をとり、クライアントがサーバにデータを書き込むように少し修正しました。これはクライアントソケットが書き込みをサポートしているので実行可能でなければなりません。私の使用事例の1つでは、クライアントはかなりの量のデータをクライアントからサーバーに送信します。この場合、ECONNRESETエラーが発生します。クライアントとサーバーのスニペットが添付されています。私は誰もがこれを見ているかどうか、彼らがカバーの下で何が間違っているのか分かっているのだろうかと思っていた。ここでクライアントがサーバに書き込むときのNodeJSネットパッケージエラー
は私のクライアントのコピーです:
var net = require('net');
var client = new net.Socket({writeable: true}); //writeable true does not appear to help
client.on('close', function() {
console.log('Connection closed');
});
client.on('error', function(err) {
console.error('Connection error: ' + err);
console.error(new Error().stack);
});
client.connect(5900, '127.0.0.1', function() {
var count = 0;
console.log('Connected');
for(var i = 0; i < 100000; i++) {
client.write('' + i + '');
//bufferSize does not seem to be an issue
//console.info(client.bufferSize);
}
});
と私のサーバー:
クライアントはそのconnect
イベントハンドラ内
for
ループでデータの送信を完了しました
var net = require('net');
var count = 0;
var server = net.createServer(function(socket) {
socket.pipe(socket); //With this uncommented I get an ECONNRESET exception after 14299 writes with it commented it hangs after 41020 writes
socket.on('data', function(data) {
console.info(count++); //This makes it occur sooner
//count++;
//maxConnections is not the issue
//server.getConnections(function(err, count) {
//console.info('count = ' + count);
//});
});
socket.on('close', function() {
console.info('Socket close');
});
socket.on('error', function(err) {
console.error('Socket error: ' + err + ', count = ' + count);
console.error(new Error().stack);
});
});
server.listen(5900, '127.0.0.1');
私はそれが問題だとは思わない。サーバーは、クライアントが送信していた100,000近くのどこにもない約10,000しか受信しませんでした。私の例では、すべてのリスナーを実装する:イベントリスナーのクローズ、データ、排水、終了、ルックアップ、タイムアウト。私は、クライアントが定期的にデータイベントとドレインイベントを受け取っていることに気づいた。これらは存在しなかったため、クライアントエラーが発生しました。見て、応答してくれてありがとう! –
TCPは、1回の読み込みで複数の書き込みのコンテンツを配信することができます。したがって、正常に実行された場合でも、サーバーは100,000回の 'data'イベントを表示しません。サーバがどれくらい受け取ったかを追跡するには、与えられた 'data'引数の長さを合計します。それは488890でなければなりません(私の最後のテストでは42188のイベントによって配信されます)。サーバーは受信したすべての情報をエコーバックしているため、クライアントはデータを取得します。クライアントがハンドラまたはpipe()宛先を登録していない場合、そのデータは破棄されますが、接続が切断されることはありません。 – ottomeister