这是我监听客户端 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/