下面是我监听客户端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 "foo bar" | nc -l 2000
输出:$ ruby tcp_test.rb
foo
甚至可以将输入记录分隔符设置为" "
:
$/ = " "
puts socket.gets.chomp