2013-07-08 109 views
2

:)我試圖製作一個Android應用程序,它將掃描特定開放端口的整個網絡。我正在使用Android Studio(Windows)和模擬器。我能夠在我的程序停止運行之前掃描網絡90秒。我沒有收到任何logcat錯誤,我在調試器中丟失了堆棧和程序計數器。沒有首先重新啓動模擬器,我無法重新啓動程序。看起來我失去了我對模擬器的任何連接。適用於Android的套接字掃描

我還應該提到刪除套接字連接線會導致任務無限期地運行。有沒有人經歷過這種時間?

任何指針正確的方向將非常感謝!

珍妮

private class getNetworkState extends AsyncTask<Integer, Integer, Integer> { 
    @Override 
    protected Integer doInBackground(Integer... params) { 

     for (int subnet2 = 216; subnet2 < 220; subnet2++) 
     { 
      for (int subnet = 0; subnet < 255; subnet++) 
      { 
       // open a tcp socket 
       String server = String.format("192.168.%d.%d", subnet2, subnet); 
       Socket socket = new Socket(); 
       try 
       { 
        socket.connect(new InetSocketAddress(server, port), timeOut); 
        System.out.println("Network state of " + server + " == " + socket.isConnected()); 
        socket.close(); 
       } 
       catch (Exception e) 
       { 
        System.out.println("Network state of " + server + " == " + e); 
       } 
      } 
     } 
     return 1; 
    } 

回答

1

在socket.connect多久你看到異常(...)?代碼存在的方式,失敗的連接將拋出一個異常,並且套接字不會被關閉。

我認爲一個更好的做法是在finally塊中關閉套接字。如果問題的原因是大量開放式套接字,這可能有助於解決問題。

private class getNetworkState extends AsyncTask<Integer, Integer, Integer> { 
    @Override 
    protected Integer doInBackground(Integer... params) { 

     for (int subnet2 = 216; subnet2 < 220; subnet2++) 
     { 
      for (int subnet = 0; subnet < 255; subnet++) 
      { 
       // open a tcp socket 
       String server = String.format("192.168.%d.%d", subnet2, subnet); 
       Socket socket = new Socket(); 
       try 
       { 
        socket.connect(new InetSocketAddress(server, port), timeOut); 
        System.out.println("Network state of " + server + " == " + socket.isConnected()); 
       } 
       catch (Exception e) 
       { 
        System.out.println("Network state of " + server + " == " + e); 
       } finally { 
        socket.close(); 
       } 
      } 
     } 
     return 1; 
    } 
+0

感謝您的relpy!我看到一個失敗的連接異常〜90%的時間。我添加了一個finally {}部分來關閉套接字,但看到相同的行爲。我認爲這是正確的道路,因爲如果我連續連接一個已知的開放端口進行測試,我沒有看到時間,但連接到已知的封閉端口,我確實看到了時間。 - 珍妮 – user2561654

+0

嗨珍妮,你有沒有想過問題是什麼? – AWT

+0

感謝您入住!我無法在這個問題上取得重大進展。如果這是一個模擬器問題,我向Google發送了一份報告,試圖清除它,因爲我無法在移動設備上運行時重現超時。我也在考慮在Ubuntu中設置我的環境,以查看它是否可能是Windows問題。 – user2561654