TL; DR TCPSocket.each
は、それが受け取る改行文字ごとに改行を繰り返します。
詳細:
TCPSocket
は上にいくつかの余分な粉砂糖とちょうどBasicSocket
です。 BasicSocket
は、IO
クラスの子です。 IO
クラスは単なるデータストリームです。したがって、iterableです。 that is whereeach
がTCPSocket
のために定義されている方法を見つけることができます。
irb
コンソールを起動し、$stdin
ソケットでコード行を入力して、each
の動作を確認します。彼らは両方ともIO
から継承します。
irb(main):011:0> $stdin.each {|arg| p arg + "."}
hello
"hello\n."
しかし、直接の質問に答えるために、ブロックは\n
文字ごとに一度呼び出されます。ここでは何が起こるかの例があります。クライアントが一度に1文字ずつデータを送信している場合、ブロックは\n
が表示されるまで実行されません。ここで
はこれを示すために迅速なサンプルのクライアントである:
irb(main):001:0> require 'socket'
=> true
irb(main):002:0> s = TCPSocket.open("localhost", 7887)
=> #<TCPSocket:fd 9>
irb(main):003:0> s.puts "hello"
=> nil
irb(main):007:0> s.write "hi"
=> 2
irb(main):008:0> s.write ", nice to meet you"
=> 18
irb(main):009:0> s.write "\n"
=> 1
そして、ここでは、サーバーをプリントアウトするものである:
"hello\n"
"hi, nice to meet you\n" # note: this did not print until I sent "\n"
はまた、セパレータは、引数(例えば 'として渡すことができることに注意してくださいデフォルトのセパレータである '$ /'を設定することで、 'IO#each 'と他のいくつかのメソッドを設定します。デフォルトのセパレータは変更されない限り' \ n \。 – Linuxios
偉大な答えが、私は最後の文で混乱している:私はTCPストリームを介して1バイト/パケットを送信する場合は、入力が '\ n'までブロックされ、ブロックに渡されるまで、バッファリングされますか? – Benno
これは正しい@Bennoですが、入力は ''\ n'''までbuffedされます。 **その後** 'each'ブロックが実行されます。 Linuxiosが指摘しているように、デフォルトの動作を変更しない限り。 –