Простой протокол обмена сообщениями TCP? - PullRequest
4 голосов
/ 16 ноября 2009

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

Ответы [ 2 ]

6 голосов
/ 18 ноября 2009

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

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

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 голос
/ 16 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...