使用 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
これは コール POSIXsend(2)
;ソケットは 初期化された 〜とO_FSYNC
設定すると、送信は同期的かつアトミックになります。
回答№2の場合は1
相手が読むために接続を閉じる必要はありません。 send
すぐに接続上でデータを転送する必要があります。相手がソケットから読み取りを行っていることを確認してください。