/ / Rubyを使用してTCP接続を維持する方法は? -ルビー、tcpsocket

Rubyを使ってTCP接続を維持するには? - ruby​​、tcpsocket

使用 TCPSocket、 する必要がある socket.puts "foobar"、 その後 socket.close 反対側のソケットを許可する socket.read メッセージ。

ソケットを介してメッセージを送受信する方法はありますが、ソケットを閉じずに、つまり、ソケットを再度作成せずにメッセージを再度送信できますか?

p.s websocketのようなもの

回答:

回答№1の場合は3

スーパークラスチェーンを上にたどると、最終的には、 IO。最も IO Rubyのオブジェクトは、ディスクからの書き込みと読み取りをより効率的にするためにデータをバッファします。

あなたの場合、バッファはフラッシュするのに十分な大きさではありませんでした(または十分な時間が経過しませんでした)。ただし、ソケットを閉じると、バッファリソースのフラッシュが強制されました。

いくつかの選択肢があります:

  • バッファを手動で強制的にフラッシュすることができます IO#flush.
  • 設定により、書き込み/読み取り後に常に同期するようにバッファを設定できます IO#sync=true。あなたのステータスを確認することができます IO を使用したオブジェクトの同期 IO#sync;私はあなたを推測しています socket.sync #=> false
  • つかいます BasicSocket#send これは コール POSIX send(2);ソケットは 初期化された 〜と O_FSYNC 設定すると、送信は同期的かつアトミックになります。

回答№2の場合は1

相手が読むために接続を閉じる必要はありません。 send すぐに接続上でデータを転送する必要があります。相手がソケットから読み取りを行っていることを確認してください。