2009-11-16 6 views
4

Я хочу отправлять сообщения между процессами Ruby через TCP без использования конечных символов, которые могли бы ограничить потенциальное содержимое сообщения. Это исключает наивный socket.puts/получает подход. Есть ли базовая реализация TCP-сообщений где-то в стандартных библиотеках ?. (я бы хотел избежать Drb, чтобы все было просто.)Простой протокол обмена сообщениями TCP?

ответ

6

Кажется, что нет канонического решения многоразового использования.

Так вот базовая реализация для архивов:

module Messaging 
    # Assumes 'msg' is single-byte encoded 
    # and not larger than 4,3 GB ((2**(4*8)-1) bytes) 
    def dispatch(msg) 
    write([msg.length].pack('N') + msg) 
    end 

    def receive 
    if (message_size = read(4)) # sizeof (N) 
     message_size = message_size.unpack('N')[0] 
     read(message_size) 
    end 
    end 
end 

# usage 
message_hub = TCPSocket.new('localhost', 1234).extend(Messaging) 
1

Обычный способ отправки строк в этой ситуации - отправить целое число (закодированное, как вам нравится), для размера строки, за которым следует множество байт. Вы можете сэкономить место, но при этом допускать произвольные размеры, используя для этого целого числа схему, похожую на UTF-8.

+2

Да, я знаю, и мне интересно, если есть каноническая библиотека, которая реализует такую ​​procotol. –

Смежные вопросы