1

私は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つの端末であり、すべてのメッセージが「from」プレフィックスですべての端末に表示されることを知っています。しかし、醜いのは、同じクラスをコピーして、端末ごとに異なるスレッドを開くことです。これは、他のマシンのコンソールに文字列を出力する方法がわからないためです。したがって、コードを次のように記述できる場合:

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を維持し、1つのスレッドを使用できます。すべてのメッセージについて、A.my_addを呼び出すだけで、すべての端末に出力されます。私はあなたの助けに感謝します。ありがとう!

4

1 に答える 1

0

これは私がこれを行う方法です:

正しいアプローチは次のとおりです。各システムには固有の IP があり、すべての通信で同じポートが使用されます。したがって、各端末は次のことを行う必要があります。 1. ローカル システムの IP を見つけて、それを start_service ルーチンに自動的に入れます。2. 送信用に 1 つのポートと受信用に 1 つのポートを定義します。3. DRB サーバーを実行します。

指定した端末 1 から端末 2 に通信するには: 端末 1 の送信ポートを使用して、端末 2 の受信ポートにメッセージを送信します。

複数の端末通信の場合: 端末のリストがあり、名前が IP アドレスにマップされます。端末のリストを走査して、受信側ポートにメッセージを送信できます。

于 2012-08-23T11:18:12.323 に答える