パブリックIPを持っていない人がいる場合は、コンピュータとクライアントが直接接続することができます。私はこれが中間の人間としてのサーバーでできると思います。最後に確立された接続は、クライアント間の直接トラフィックでなければなりません。これはどのように可能であり、テクニカルとは何ですか?パブリックIPなしでhttpで2台のコンピュータを接続
私は本当にJavaでいくつかのコードfxを見たいと思います。
おかげ
パブリックIPを持っていない人がいる場合は、コンピュータとクライアントが直接接続することができます。私はこれが中間の人間としてのサーバーでできると思います。最後に確立された接続は、クライアント間の直接トラフィックでなければなりません。これはどのように可能であり、テクニカルとは何ですか?パブリックIPなしでhttpで2台のコンピュータを接続
私は本当にJavaでいくつかのコードfxを見たいと思います。
おかげ
ポート転送ができない場合は、あなたがNAT traversalと呼ばれるUDPトラフィックで使用することができ、主に、信頼性の高い技術があります。それは、ランデブーポイントとして動作するために中間マンサーバを必要とするが、初期設定後、すべてのトラフィックはエンドポイントからエンドポイントになる。
これはすべての場合に機能するわけではありません。さまざまなNATレイヤーが外部エンドポイントを内部エンティティにどのようにマッピングするかによって異なります。
TCP NATトラバーサルは実装が非常に難しく、動作する可能性は非常に低いです。
(私は正常にいくつかのNAT層の後ろの両方、異なる大学で2台のコンピュータ間のOpenVPNの接続を確立するために、UDP NATトラバーサルを使用していた!)
私は、Javaの修正を知りませんが、あなたが使用することができます動的DNSサービスを使用して、トラフィックを非公開IPに再ルーティングします。彼らはISPによって割り当てられたパブリッククライアントIPを追跡し、それをサービスに報告し、サービスをホストテーブルに更新するクライアントを使用すると思います。パブリック要求をプライベートIPに転送するために、各システムのルータにいくつかの設定が必要な場合もあります。
はこれを実行するために使用されるいくつかの技術、ポート転送、NAT、ダイナミックDNSなどがあるでしょう
あなたはpropably両当事者がNATの背後にある場合hole punching(TCPまたは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アドレスとポートを交換します静的でない限り到達可能なサーバーもあります)
ありがとうございました。それは私が期待するものではありませんでした。それはSkypeがトラフィックを処理する方法ですか?これはJavaのような言語でできますか? – Stig
SkypeはNATトラバーサルを使用します。実際には、Javaで基本的なNATトラバーサルクライアントとランデブーサーバーを実装していましたので、間違いなく可能です。 – cdhowie
SkypeはUDPホールパンチングを使用していますか? – Stig