2016-01-19 25 views
5

サーバーに接続するサーバーとクライアントを作成する必要があります。パブリックIPアドレスに接続するJavaソケット

問題: "クライアントはローカルホストにしか接続できませんが、インターネット上のサーバーには接続できません。 」と語った。

まず、ポートが転送され、到達可能であることを確認しました。ポートをテストしました。第2に、サーバーマシンから完全にファイアウォールを無効にしました。以下

私が使用していたテストコードです:

サーバー:単なる空想何も - クライアントが接続されている場合だけで接続を待ち受ける他、終了しません。

public class Server { 
public static void main(String args[]) { 
    try { 
     ServerSocket srvr = new ServerSocket(52000); 
     srvr.accept(); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

クライアント:私は "biogenserver2.noip.me" に、サーバーのIPをマスクするno-ip.comを使用していました。 使用方法.getCanonicalHostName();はipを返します。

public class Client { 
public static void main(String args[]) { 
    try { 
     String ip = Inet4Address.getByName("somets.noip.com").getCanonicalHostName(); 
     InetSocketAddress sa = new InetSocketAddress(ip, 52000); 
     //Socket skt = new Socket("0.0.0.0", 52000); //local - this works fine. 
     Socket skt = new Socket(); 
     skt.connect(sa); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

私はこれを実行すると、サーバーは正常に接続されますが、クライアントが「接続タイムアウト」の例外

を返す任意の助けが理解されるであろう。ありがとう。

+0

ちょっと接続してみましたか?サーバコードと同様に 'Socket s = srvr.accept();'と 'Thread。sleep(100); '私は、接続にハンドシェイクを完了するのに十分な時間がないと思う。 – Fildor

+0

はい、私は事実を持っている、同じ問題が続く。 localhostを介して接続するときに、それがうまく接続するコードに問題はありません。私もskt.connect(sa、50000)を試しました。 somoneが以下に示唆しているように私はまだ同じ結果を得る。 – NullOverFlow

+1

明確にするために、no-ipから返されたパブリックIPを介してポートが開いていることを確認しました。サーバーマシンではないマシン上でその小さなtestclientを実行すると例外なく終了します。 – Fildor

答えて

-1

サーバは、クライアントアプリケーションが使用するIPプロトコルのバージョンは何

+0

クライアントがSYN-ACKを受信しなかったために接続タイムアウトが発生しました。ハンドシェイクは成功するためには時間がかかりません。失敗は時間だけでなく、接続の問題を示すものです。サーバーの受け入れはそれとは何の関係もありません。クライアント接続の試行がタイムアウトすると、サーバーはそれをまったく受け入れません。 – EJP

0

を受け入れる前に、それが終了する3ウェイハンドシェイクとクライアントtimesoutのための時間を取ることができますか? Linuxでは、で最初のフィールドがtcptcp6かどうかを調べることができます。後者の場合は、IPv6接続に関する問題が存在する可能性があり、IPv6にIPv4を使用する方が望ましい場合は、-Djava.net.preferIPv4Stack=trueをJVMに指定します。

+0

Inet4Addressがこれを解決するので、私はipv6を持っていないので、代わりにipv4を取得する必要があります。これは問題ではありません。 – NullOverFlow

2

回答:

「ちょうど明確にするため:あなたはノー-IPによって返されると、あなたは少しtestclientその(上で実行したときに、サーバーが例外なく終了しますように、ポートがパブリックIP経由で開かれているチェックしていますサーバーマシンではないマシン) - それは正しいのですか?からFildor

TL:DR

は、独自のローカルネットワークに、あなたのパブリックIPを通して、あなたのサーバーに接続しようとするクライアントとサーバと同じマシン上と同じネットワークになります実行しないでくださいクライアントタイムアウト例外が発生する

クライアントとサーバーを同じマシン上と同じネットワーク上で実行していました。これにより、クライアントのタイムアウト例外が発生しました。私は別のマシンと別のネットワーク上でクライアントを実行しようとし、私は正常に接続することができました。

関連する問題