这是我的侦听客户端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
?
如果没有,那么你知道哪个内存效率高的字符串是干嘛?
答案 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