1

クライアントTCPソケットをリッスンするコードは次のとおりです。

def initialize
    @msg = ''
    @messages = Queue.new
    @socket = TCPSocket.open('127.0.0.1', 2000)
    Thread.new do
        loop do
            ch = @socket.recv(1)
            if ch == "\n"
                puts @msg unless @msg.blank?
                @msg = ''
            else
                @msg += ch
            end
        end
    end
end

私が嫌いなのは、バイトごとの文字列連結です。メモリ効率が良くないはずです。

ソケットのreadメソッドは改行まで読み込みます。ソケットは、たとえば、カスタム ターミネータ文字まで読み取ることができます0x00か?

そうでない場合、どのメモリ効率の高い文字列追加を知っていますか?

4

1 に答える 1

6

IO#getsカスタムセパレーターで使用できます:

# tcp_test.rb
require 'socket'

TCPSocket.open('127.0.0.1', 2000) do |socket|
  puts socket.gets("\0").chomp("\0") # chomp removes the separator
end

Netcatを使用してサーバーをテストします。

$ echo -ne "foo\0bar" | nc -l 2000

出力:

$ ruby tcp_test.rb
foo

入力レコード区切り"\0"次のように設定することもできます。

$/ = "\0"
puts socket.gets.chomp
于 2014-06-04T07:16:02.643 に答える