TL; DR TCPSocket.each
, aldığı her yeni satır için \n
dizgisini alır.
Diğer ayrıntılar:
A TCPSocket
üstte bazı ekstra toz şeker ile sadece bir BasicSocket
olduğunu. Ve BasicSocket
, IO
sınıfının bir alt öğesidir. IO
sınıfı sadece bir veri akışıdır; bu nedenle, yinelenebilir. Ve that is whereTCPSocket
için each
'un nasıl tanımlandığını bulabilirsiniz.
irb
konsolunu açın ve $stdin
soketiyle kod satırınızı nasıl girdiğinizi görmek için each
nasıl davranacağını öğrenin. Her ikisi de IO
'dan miras aldılar.
irb(main):011:0> $stdin.each {|arg| p arg + "."}
hello
"hello\n."
Ama doğrudan soruyu cevaplamak için, blok \n
karakteri başına bir kez denir: Burada ne bir örnektir. Eğer istemciniz bir seferde 1 veri gönderiyorsa, blok \n
görene kadar yürütülmeyecektir. İşte
bunu göstermek için hızlı bir numune istemcisidir:
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
Ve burada sunucu çıktısı şudur:
"hello\n"
"hi, nice to meet you\n" # note: this did not print until I sent "\n"
Ayrıca ayırıcı bir argüman olarak geçirilebilir olduğuna dikkat (örn ' thing.each (sep = "\ r \ n") ') ya da" IO # her "için bir kaç diğer yöntemle birlikte, $ /', değiştirilene kadar, varsayılan olarak "varsayılan" \ n'. – Linuxios
Harika bir yanıt, ama son cümle ile kafam karıştı: Bir TCP akışı üzerinden 1 bayt/paket gönderirseniz, bayt '\ n' olana kadar giriş arabelleğe alınır ve yalnızca bloka geçirilir, değil mi? – Benno
Bu doğru @Benno, bayt '' \ n'' olana kadar giriş arabelleğe alınacaktır. ** O zaman ** 'her' bloğu yürütülür. Linuxios'un belirttiği varsayılan davranışı değiştirmediğiniz sürece. –