Ruby TCPSocket读取直到自定义终结符字符

时间:2014-06-04 06:53:48

标签: ruby sockets string-concatenation terminator

这是我的侦听客户端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

如果没有,那么你知道哪个内存效率高的字符串是干嘛?

1 个答案:

答案 0 :(得分: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