2013-05-03 97 views
0

我想檢查某個IP端口是否在Java中爲Android應用程序打開。檢查服務器是否正常運行

這是調用代碼:

button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       RetreiveFeedTask Check=new RetreiveFeedTask(); 
       try{ 
       Work=(Check.execute(Exec, ServerIP, ServerPort)).get(); 
       ALL.setText(Work);//Display what is returned 
       } 
       catch(Exception e) 
       {e.printStackTrace(); } 
       if(Work.equal("xyz") 
       { 
        //Do Stuff 
       } 
       else 
       { 
            //Do Other Stuff 
       } 

      } 
     }); 

異步代碼:

class RetreiveFeedTask extends AsyncTask<String , String , String > { 

    //private Exception e; 
    String GotBack="3"; 

    @Override 
    protected String doInBackground(String... params) { 
     try{   
     Socket s= new Socket(params[1], Integer.parseInt(params[2])); 
     s.close(); 
     } 
     catch(Exception e){e.printStackTrace(); return "3";} 


     try{ 
       Socket socket = new Socket(params[1], Integer.parseInt(params[2])); 
       PrintWriter output = new PrintWriter(socket.getOutputStream());  
       BufferedReader input=new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       output.println(params[0]); 
       output.flush(); 
       String read=""; 
       while((read=input.readLine())!=null) 
       { 
       GotBack=read; 

       } 

       socket.close(); 
       } 
      catch(SocketException e){e.printStackTrace(); } 
      catch(Exception e){e.printStackTrace();} 

     return GotBack; 
    } 
} 

目前,該按鈕的瞬間,當我按下它...

我檢查{ServerIP1 -ServerPort1}接受連接,如果不是,我需要知道。

+0

很難想象你的應用「凍結」。如果是這樣,那是因爲你的問題中沒有包含代碼。另外,「凍結」是什麼意思? – 2013-05-03 11:36:49

+0

當按鈕保持按下時,不會凍結。我相信這是例外的原因。因爲當主服務器啓動時,一切正常...... – 2013-05-03 11:39:53

+1

爲什麼不將e.printStackTrace()添加到空的catch子句中,以便您可以看到發生了什麼。 – MarsAtomic 2013-05-03 11:49:17

回答

1

我認爲你打電話給你的Asynctask兩次,第一次使用普通服務器,第二次使用備份服務器。現在試試這個,然後啓動你的AsyncTask來指定兩個服務器和兩個端口,即 BackgroundTask(NrmSrvAddress,NrmSrvPort,bckSrvAddress,bckSrvPort); 然後用下面的函數連接到服務器(S): (我還沒有運行的代碼,它只是一個想法)

public Socket ConnectToServer(String normalSrv, int nrmPort, String backupSrv, int bckPort) 
{ 
    // Let's try to connect to the Normal Server first. 
    try 
    { 
     Socket retSocket = new Socket(); 
     InetAddress addr = InetAddress.getByName(normalSrv); 
     SocketAddress sockaddr = new InetSocketAddress(addr, nrmPort); 
     retSocket.connect(sockaddr, 30000); // 30 seconds timeout 
     return retSocket; 
    } 
    catch (Exception e) 
    { 
     // can't connect to the Normal Server 
     e.printStackTrace(); 
    } 

    // Normal server is down, let's try to connect to the Backup Server. 
    try 
    { 
     Socket retSocket = new Socket(); 
     InetAddress addr = InetAddress.getByName(backupSrv); 
     SocketAddress sockaddr = new InetSocketAddress(addr, bckPort); 
     retSocket.connect(sockaddr, 30000); // 30 seconds timeout 
     return retSocket; 
    } 
    catch (Exception e) 
    { 
     // can't connect to the Backup Server 
     e.printStackTrace(); 
    } 
    // none of the server are available 
    return null; 
} 

// Then, in your AsyncTask: 
@Override 
protected String doInBackground(String... params) { 

    Socket socket = ConnectToServer(params[1], Integer.parseInt(params[2]), params[3], Integer.parseInt(params[4])); 
    if (socket != null) 
    { 
     try{ 
       PrintWriter output = new PrintWriter(socket.getOutputStream());  
       BufferedReader input=new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       output.println(params[0]); 
       output.flush(); 
       String read=""; 
       while((read=input.readLine())!=null) 
       { 
        TheData=read; 
       } 
      } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      socket.close();             
     } 
     return TheData; 

哦,我明白了,你嘗試在onclick來執行的AsyncTask事件,並希望主線程等到它完成?這不是使用AsyncTask的方式。您應該使用AsyncTask的onPostExecute方法來處理返回值。這就是爲什麼你的按鈕凍結。

我可以建議如下:

  1. 創建按鈕的onClick事件的新線程。如果你想使用AsyncTask,那麼請閱讀它以及它的工作原理。

  2. 在該線程(或後臺進程)嘗試連接到「正常服務器」,如果失敗,請嘗試備份服務器。

主要的想法是對我「ConnectToServer」之前發佈的代碼,你要的部分,第一個嘗試,而不是返回該套接字連接到普通服務器,並返回它得到的插座,只是做了在那裏閱讀。如果連接失敗,則在備份服務器上執行相同的操作。

+0

感謝您的想法。我嘗試過,但仍然是同樣的問題,卡住 – 2013-05-03 13:10:41

+1

再次閱讀我的答案,我添加了更多的線。 – 2013-05-08 21:02:37

0

如何在您的客戶端代碼中捕獲java.net.SocketException異常。如果服務器關閉,您應該得到一個SocketException,具體取決於您可以決定連接到輔助服務器。

相關問題