Создать простейшую систему чата только с ruby DRb
Я только что выучил DRb и сделал с ним систему чата. Вот коды:
Терминал 1:
require 'drb'
class A
def A.my_add(line, from)
puts from + ': ' + line
end
end
DRb.start_service('druby://127.0.0.1:61676', A)
B = DRbObject.new_with_uri('druby://127.0.0.1:61677')
while (line=gets).chomp != 'bye'
A.my_add line, "Terminal 1"
B.my_add line, "Terminal 1"
end
Терминал 2:
require 'drb'
class B
def B.my_add(line, from)
puts from + ': ' + line
end
end
DRb.start_service('druby://127.0.0.1:61677', B)
A = DRbObject.new_with_uri('druby://127.0.0.1:61676')
while (line=gets).chomp != 'bye'
A.my_add line, "Terminal 2"
B.my_add line, "Terminal 2"
end
Я знаю, что это очень просто, всего 2 терминала, и все сообщения отображаются во всех терминалах с префиксом "от". Но уродливым является то, что я скопировал один и тот же класс и открыл разные потоки для каждого терминала, потому что я не знаю, как вывести строку на консоль другого компьютера. Таким образом, если коды могут быть написаны так:
class A
def A.my_add(line, from)
for <DRb Server and all clients> do
puts<to that terminal> from + ': ' + line
end
end
end
Тогда мы можем просто поддерживать класс A и использовать один поток. Для каждого сообщения просто вызовите A.my_add, и оно будет распечатано на всех терминалах. Я ценю вашу помощь. Спасибо!
1 ответ
Вот как я мог бы сделать это:
Правильный подход таков: каждая система будет иметь уникальный IP-адрес, и все коммуникации будут использовать один и тот же порт. Таким образом, каждый терминал должен будет сделать следующее: 1. Найдите IP-адрес локальной системы и автоматически вставьте его в свою подпрограмму start_service. 2. Определите один порт для отправки и один порт для приема. 3. Запустите сервер DRB.
Чтобы установить связь с указанным терминалом 1 до терминала 2: Используйте порт отправки в терминале 1, чтобы отправить сообщение на порт приема в терминале 2.
Для связи между несколькими терминалами: у вас есть список терминалов, который сопоставляет имена с IP-адресами. Вы можете просмотреть список терминалов, чтобы отправить сообщение на порт получателя.