2010-11-19 19 views
0

パブリックIPを持っていない人がいる場合は、コンピュータとクライアントが直接接続することができます。私はこれが中間の人間としてのサーバーでできると思います。最後に確立された接続は、クライアント間の直接トラフィックでなければなりません。これはどのように可能であり、テクニカルとは何ですか?パブリックIPなしでhttpで2台のコンピュータを接続

私は本当にJavaでいくつかのコードfxを見たいと思います。

おかげ

答えて

2

ポート転送ができない場合は、あなたがNAT traversalと呼ばれるUDPトラフィックで使用することができ、主に、信頼性の高い技術があります。それは、ランデブーポイントとして動作するために中間マンサーバを必要とするが、初期設定後、すべてのトラフィックはエンドポイントからエンドポイントになる。

これはすべての場合に機能するわけではありません。さまざまなNATレイヤーが外部エンドポイントを内部エンティティにどのようにマッピングするかによって異なります。

TCP NATトラバーサルは実装が非常に難しく、動作する可能性は非常に低いです。

(私は正常にいくつかのNAT層の後ろの両方、異なる大学で2台のコンピュータ間のOpenVPNの接続を確立するために、UDP NATトラバーサルを使用していた!)

+0

ありがとうございました。それは私が期待するものではありませんでした。それはSkypeがトラフィックを処理する方法ですか?これはJavaのような言語でできますか? – Stig

+1

SkypeはNATトラバーサルを使用します。実際には、Javaで基本的なNATトラバーサルクライアントとランデブーサーバーを実装していましたので、間違いなく可能です。 – cdhowie

+0

SkypeはUDPホールパンチングを使用していますか? – Stig

-2

私は、Javaの修正を知りませんが、あなたが使用することができます動的DNSサービスを使用して、トラフィックを非公開IPに再ルーティングします。彼らはISPによって割り当てられたパブリッククライアントIPを追跡し、それをサービスに報告し、サービスをホストテーブルに更新するクライアントを使用すると思います。パブリック要求をプライベートIPに転送するために、各システムのルータにいくつかの設定が必要な場合もあります。

はこれを実行するために使用されるいくつかの技術、ポート転送、NAT、ダイナミックDNSなどがあるでしょう

+2

これは動的DNSとは異なります。プライベートIPアドレスを知っていてもプライベートIPアドレスであるため、ルーティングすることはできません。 – cdhowie

+0

動的DNSは、マシンの動的* public * IPが変更されたときに更新される短いTTLを持つ固定ホスト名を提供します。 – Quentin

+0

私のエラーは、リビジョンを参照してください。 – bakoyaro

2

あなたはpropably両当事者がNATの背後にある場合hole punchingTCPまたはUDP)を使用する必要があります。このような何か:

socket = new DatagramSocket(port); 
volatile boolean connectionEstablished = false; 
volatile boolean reveivedSomething = false; 

送信者スレッド:

while (!connectionEstablished) { 
    byte[] buf = new byte[256]; 
    buf[0]=reveivedSomething?1:0; 
    DatagramPacket packet = new DatagramPacket(buf, buf.length, 
      otherpcpublicaddr, otherpcsport); 
    socket.send(packet); 
    Thread.sleep(500); 
} 

レシーバー-スレッド:

while (true) { 
    byte[] buf = new byte[256]; 
    DatagramPacket packet = new DatagramPacket(buf, buf.length); 
    socket.receive(packet); 
    reveivedSomething=true; 
    if (buf[0]==1) { 
    connectionEstablished=true; 
    break; 
    } 
    Thread.sleep(500); 
} 

(あなたは、両方のPCでこれを実行する必要がありますし、使用してIPアドレスとポートを交換します静的でない限り到達可能なサーバーもあります)

+0

ありがとうございます。これは "UDPホールパンチング"テクニックですよね?私は両方のクライアントのIPとポートをハードコードし、サーバーなしでこの作業を行うことができますか? – Stig

+0

@Stig:はい、そうです。私が知る限り、それはうまくいくはずです。 – thejh

+0

@Stig:これはほんの少しの場合(または1つの場合)、両方のルータで単純なポートリダイレクションルールを使用することを検討する必要があります。 – thejh

関連する問題