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



下面是我监听客户端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

我不喜欢的是逐字节的字符串连接。它不应该占用内存。

socket的read方法读取到换行符。套接字是否可以读取到某个自定义终止符,例如0x00 ?

如果不是,那么你知道哪种内存效率高的字符串追加?

您可以使用IO#gets与自定义分隔符:

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

使用Netcat测试服务器

$ echo -ne "foobar" | nc -l 2000
输出:

$ ruby tcp_test.rb
foo

甚至可以将输入记录分隔符设置为"":

$/ = ""
puts socket.gets.chomp

相关内容

  • 没有找到相关文章

最新更新