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

标签 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

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

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

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

最佳答案

你可以使用 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

关于Ruby TCPSocket 读取直到自定义终止符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24030908/

相关文章:

ruby-on-rails - Rails Devise - 为登录用户和匿名用户定义单独的根路径

ruby - 如何将字符串转换为方法调用?

Java连接字符串、整数和 float 的最快方法

c - 区分socket上的接收文件

java - 当套接字被接受时,我怎样才能关闭这个对话框?

php - 如何在 PHP 中对字符串使用 += 运算符?

java - 串联字节+字符串+字节的 SHA-256

ruby-on-rails - "Complex"rails 中的分组和索引?

ruby-on-rails - rails 5 : "belongs_to through" kind of association

Java套接字绑定(bind)两次无异常