2011-04-19 17 views
4

ソケットが存在しないサーバーに接続しようとしていますが、なぜ例外が発生するのかわかりません。が発生しています。ここで接続できませんがソケットは例外をスローしません

は私のコードです:

public class TestSocket extends Activity { 
    private static final String TAG = "TestSocket"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     BasicThread t = new BasicThread(); 
     t.start(); 
    } 

    class BasicThread extends Thread { 
     @Override 
     public void run() { 
      Log.d(TAG, "Before"); 
      try { 
       new Socket("42.42.42.42", 12345); 
       Log.d(TAG, "Connected"); 
      } catch (Exception e) { 
       Log.d(TAG, "Exception"); 
      } 
      Log.d(TAG, "After"); 
     } 
    } 
} 

何もないので(Wiresharkのを実行している間、私はまた、私自身のIPアドレスを試みたが、私は最初のAndroidに自分のコンピュータから自分のコンピュータ、その後[RST, ACK]にアンドロイドから[SYN]を取得しますこのポートで聞いていますが、私はまだAndroidで例外がありません。

また、私は物理的な電話(Nexus S)でテストしています。私はマニフェストでインターネット許可を持っています。

Exceptionが届かないのはなぜですか?

編集:

より正確には、私が手に出力され

D/TestSocket(17745): Before 
D/TestSocket(17745): Connected 
D/TestSocket(17745): After 

(とないException)ソケットコンストラクタで

答えて

0

が、それはスローだときのホストのIPアドレス解決できないホスト名を渡していないため、別の例外がスローされることになります。私は例外が実際にはURLクラスかそのような解決策を行うものから来ていると信じています。

connect(..)メソッドが例外をスローするはずですが、あなたの言うとおりには表示されません。

編集:明らかにAndroid(一部のバージョン)が正しく動作しないため、おそらくバグです:http://code.google.com/p/android/issues/detail?id=6144。私が思ったように、リンクはエミュレータを参照するように見えません。

+0

はい、私はIOExceptionがスローされることを期待していましたが、そうではなく、何もスローされません。 –

+0

私は例外を飲み込むことを期待しています(私はSocketのシミュレートされた置き換えをコーディングした経験があり、コンストラクタは実際には例外処理の混乱です)。引数のないコンストラクタでソケットを作成してから、connectを明示的に呼び出して例外が発生するかどうかを確認することができます。また、コンストラクタの後にソケットの接続状態をチェックしてから、自分のIOExceptionをスローするか、失敗してもかまいません:) –

+0

私は(ジョセフ・アールの答えのコードで)試しましたが、まったく同じ結果があります。 –

0

ソケット接続に例外が発生する可能性があるさまざまな原因があります。しかし

、TCPプロトコルは、接続プロセスを開始するために送信するSYNメッセージがファイアウォールでブロックされ

  • 、borkedネットワークを介してルーティングさ
  • 、またはその一部のエンドポイントにルーティングさ
  • ある場合応答しません。

開始マシンのTCPスタックは、再試行して再試行します。接続タイムアウトが設定されていると、最終的に例外が発生しますが、時間がかかることがあります。


それはAndroidのエミュレータではなく、実際のデバイス上で動作するという事実は、単に彼らが実装または異なるように構成されていることを意味します。 (たとえば、エミュレータのデフォルトの接続タイムアウトが異なると、そのシナリオで接続が拒否されるように設計されている可能性があります。)

結論は、コードを実際のデバイスで動作させる必要があることです。あなたのデバイスに接続タイムアウトを設定させる最良の方法を見つけて、存在しないサーバーと通信するときに動作することを確認してください。

+0

何かが '[RST、ACK]'パケットで応答します(これは誰もがここで聞いていないことを意味します)。ところで、私はエミュレータを試して、私は 'ConnectException:Connection refused'を持っています。しかし、これは私の電話では機能しません。 –

+0

リトライ回数と間隔は、TCP/IPのOS実装によって決まります.Javaは、これらの値が何であるかを調べたり、変更したりする方法を提供していません。しかし、Java *は、タイムアウトの期限が切れたときに未接続ソケットの例外を発生させるべきです。無限かもしれませんが、連続したコードは実行されません。 –

+0

RST(リセット)応答は「接続が拒否されました」とマッピングする必要があります。 –

-2

あなたのtry catchコードはIO例外をキャッチしません。このようなことを試してください

try 
{ 
    // to get the ip address of the server by the name<br> 
    InetAddress ip =InetAddress.getByName("example.com"); 

    sock= new Socket(ip,Server.PORT); 
    ps= new PrintStream(sock.getOutputStream()); 
    ps.println(" Hi from client"); 
    DataInputStream is = new 
    DataInputStream(sock.getInputStream()); 
    System.out.println(is.readLine()); 
}catch(SocketException e){ 
    System.out.println("SocketException " + e); 
}catch(IOException e){ 
    System.out.println("IOException " + e); 
} 
+2

私のコードはIOExceptionを含むすべての例外をキャッチします。 –

関連する問題