0

Ruby drbでいくつかのテストを行っています。私は次のコードを持っています(ルビードキュメントにあるサンプルコードのみ)

サーバ:

require 'drb/drb'
URI="druby://:9000"
class TimeServer
  def get_current_time
    return Time.now
  end
end
FRONT_OBJECT=TimeServer.new; $SAFE = 1
DRb.start_service(URI, FRONT_OBJECT)
DRb.thread.join

クライアント:

require 'drb/drb'
SERVER_URI="druby://private-ip:9000"
DRb.start_service
timeserver = DRbObject.new_with_uri(SERVER_URI)
puts timeserver.get_current_time

これは、両方が同じルーターに接続している場合 (たとえば、同じプライベート IP xxx151 と xxx155 を共有している場合) に機能します。

しかし、何マイルも離れたマシンでテストし、サーバー URI をSERVER_URI="druby://public-ip-of-server:9000"クライアント側に変更すると、接続タイムアウトが発生します。

誰かが解決策を知っていますか?ルーターでのポート転送はオプションではありません。

4

1 に答える 1

0

あなたの問題は、ステートフル パケット インスペクション ファイアウォール(spi)を扱っていることだと思います。ほとんどのファイアウォールは、最初に内部から確立されなかった外部からのネットワーク接続を許可しません。

スカイプがこれを回避する方法は、クライアントがインターネット上のサーバーへの接続を確立してから接続し直し、競合を完了するために必要な追加のポートにクライアントを接続させることです。いずれにせよ、一方の側で接続を受け入れる必要があります。

1) Web サーバーにアクセスできる場合は、サービスを Restfull Web サービスとして実装できます。

2) drb は暗号化やセキュリティを提供しないため、ssl または ssh でラップすることを検討することをお勧めします。

于 2013-05-12T13:13:16.560 に答える