2016-12-14 21 views
-1

サービスでソケットを開き、一部のデータをサーバーに送信し、受信データをリッスンするアプリケーションをプログラミングしています。アンドロイドデバイスでインターネットとの接続が失われたときに問題が発生します。ここでインターネットに接続していないときにSocketExceptionが発生する

私は

java.net.SocketExceptionが取得する場所のコードスニペットです:のrecvfromに失敗しました:インターネット接続が失われたときETIMEDOUT(接続が をタイムアウトし)

try{ 
     mSocket = new Socket("xxx.xxx.xxx.xxx", xxxxx); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(mSocket.getInputStream())); 
     String s; 
     while((s = in.readLine())!= null){ //here error of course 
      ... 
     } 
     mSocket.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

エラーがスローされますがBufferedReaderを試す readLine()これを避ける方法と、なぜそれはもちろんですか?私は次のシナリオを行うにしようと試みまで

UPDATE

エラーが私を気にしませんでした: 1)を無線LANで実行ソケットは 2オン)また、モバイルデータ 3をオン)無線LAN

をオフに

wifiがオフになっているときに、モバイルデータを介してインターネットに接続しているので、エラーなしでソケットで引き続きリッスンします。これは可能ですか?

+0

インターネット接続が緩んでいませんか?あなたが接続していないときに、ある種の「例外」がスローされることは、このあいまいではありませんか?あなたは今のようにそれをキャッチして、ユーザーのための接続が切断されたことに関する情報を表示してください – snachmsm

+0

(in.ready()){ s = in .readLine(); ... } –

+0

投稿を更新しました。 –

答えて

1

キャッチブロックに新しいソケットを再接続する必要があります。元の接続は今やなくなってしまっており、「シームレスに」交換する方法はわかりません。

try { 
    mSocket = new Socket("xxx.xxx.xxx.xxx", xxxxx); 
    ... 
} catch(Exception e){ 
    try { 
     mSocket = new Socket("xxx.xxx.xxx.xxx", xxxxx); 
     ... 
    } catch (Exception e2) { 
     // OK you really lost connectivity at this point, tell the user. 
    } 
} 
+0

接続は実際には失われていません。接続タイプがWi-Fiからモバイルデータに変更されています。 –

+1

私が言ったように、私はあなたがそのような接続タイプを交換できるとは思わない。私はTCPが実際に接続を切断すると信じているので、新しい 'Socket'が必要です。 – Adam

+1

@DomenJakofčičあなたは間違っています。接続が失われます。ソケットが壊れていて閉じている必要があります。 – EJP

関連する問題