2016-01-07 14 views
7

Ruby'ye fazla aşina değilim, bu nedenle bu yöntemle ilgili belgeleri bulamadım. BuTCPSocket # her biri Ruby'de ne yineliyor?

require "socket" 

srv = TCPServer.new("localhost", 7887) 
skt = srv.accept 
skt.each {|arg| p arg} 

gibi bir TCPSocket nesnenin her çağrı, blok bir kere satıra (her \ 'n' karakter sonra), bir kez dize başı (sonra sonra, TCP paket bir kez adı olsun mu

her NUL/EOF), ya da tamamen farklı bir şey?

cevap

5

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" 
+1

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

+0

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

+0

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. –

İlgili konular