TCPServerのから読み取るための最も効率的な方法は何ですか?
質問
私は、TCPクライアントに接続されたルビーサーバーを作成しています。私のサーバーはTCPServerのを使用していると私はTCPServerの:: RECV()を使用しようとするんだけど、それはデータを待たない、これだけのデータが受信されるまで、タイトなループで続けています。
間欠データを処理するための最も効率的な方法は何ですか?私は、私は別のサーバーをエミュレートしようとしてるので、中に送信されるデータを変更することはできませんよ。これは、データが送信されるのを待つだろうTCPServerの/ TCPSocketからの文のように読むか?
require "socket"
dts = TCPServer.new('localhost', 20000)
s = dts.accept
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
あなたの時間をありがとうます。
解決
あなたは確かにrecvは「」を返すされていないされている - ソケットが閉じられている意味しますか? ない場合は、おそらくあなたのソケットが何らかの形で非ブロッキングに設定されている?
EventMachineは、実際にソケットプログラミングのためのスレッドを使用するよりもはるかに高速です:) GL。 -r
他のヒント
あなたが求めてきた質問に基づいて、私はあなたがEventMachineのようなフレームワークを試してみて、あなたの代わりに、サーバーのラッパーを書くと周りに大騒ぎしようとしているの欲しいものを実装してサーバを書くべきだと思います。
言われていること、ソケットから読み取るための最も効率的な方法は、適切な選択呼び出しを使用して、開いているすべての接続をポーリングすることです。これは前にクライアントサーバアプリケーションを開発しています誰のためのかなり学術的なものですが、あなたが簡単に間違って得ることができるものがたくさんあるので、それは迷惑です。例えば。あなたが呼び出しをブロックしないように特に注意しないなら複数の接続を処理することは厄介な状況のすべての種類につながることができます。
EventMachineフレームワークを使用すると、常に例えば、そこからテンプレートおよび作業を開始することができますので、内蔵のEventMachine ::プロトコル:: LineAndTextProtocol 1は偉大な基盤として機能し、クエリ/応答型サーバを開発することが容易になりますほとんどのため。