1

次のコードを持つTCPサーバーがあります。

// Start a TCP Server
require('net').createServer(function (socket) {

  // Handle incoming messages from clients.
  socket.on('data', function (data) {
    console.log("received:" + data);

    // Do something with the data
    //...

    // Send result to client
    socket.write('OK');          // Code added which make the server crash
  });
}).listen(10000);

クライアントが接続するたびに、サーバーはソケットからデータを取得して処理します。クライアントに応答を送信しようとしない場合、これはうまく機能します。

「socket.write("ok");」を追加すると、次のエラーが表示されます (ソケットが既に閉じられているように見えますか?):

"memoryUsage":{"rss":22474752,"heapTotal":16571136,"heapUsed":7168552}},"os":{"loadavg":[1.25634765625,1.111328125,1.00341796875],"uptime":185009}," trace":[{"column":11,"file":"net.js","function":"errnoException","line":884,"method":null,"native":false},{" column":19,"file":"net.js","function":"TCP.onread","line":539,"method":"onread","native":false}],"stack" :["エラー: ECONNRESET の読み取り"、" errnoException (net.js:884:11) で"、"TCP.onread (net.js:539:19)" で"]、"レベル":"エラー"、"メッセージ":"uncaughtException: ECONNRESET の読み取り","タイムスタンプ":"2013-09-10T14:11:29.354Z"}

何が間違っているのですか?

編集

次の Ruby コードを使用してクライアントをシミュレートします。開いているソケットごとにスレッドを使用する必要がありますか?

...
# Send test data to server
[1,2,3,4,5].each do |data|
  puts "sending #{data}"
  s = TCPSocket.open(host, port)
  s.puts data 
end
4

1 に答える 1

2

サーバーにメッセージを送信した後、Ruby クライアントは実行を完了して終了します。サーバーからの応答を期待しないため、待機しません。次のようにクライアントを変更するだけです。

  s = TCPSocket.open(host, port)
  s.puts data 
  puts s.read(2) //wait for response

読み取りがブロックされているため、クライアントはループ内でサーバーから何かを受信するまで次のメッセージを送信しません。データを並行して送信するには、a) ruby​​ でノンブロッキング I/O を使用する (方法がわからない) か、b) これを各クライアントのスレッドを生成するラッパーにラップする必要があります。

于 2013-09-10T15:23:12.383 に答える