2013-05-03 3 views
0

특정 IP 포트가 Java에서 Android 응용 프로그램 용으로 열려 있는지 확인하고 싶습니다.예외없이 서버가 작동하는지 확인하십시오.

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 있는지 확인 :

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 
       } 

      } 
     }); 

비동기 코드 :

는 호출하는 코드입니다 -ServerPort1} 연결을 허용합니다.

+0

앱이 정지되는 것을 상상해보십시오. 그렇다면 귀하의 질문에 포함시키지 않은 코드 때문입니다. 게다가, "얼어 붙음"이란 무엇을 의미합니까? –

+0

버튼을 눌렀을 때 멈추지 않습니다. 나는 그것이 예외의 원인이라고 확신한다. 메인 서버가 정상적으로 작동 할 때 모든 것이 정상이기 때문에 ... –

+1

e.printStackTrace()를 빈 catch 절에 추가하여 어떤 일이 벌어지는 지 확인할 수 있습니다. – MarsAtomic

답변

1

Asynctask를 처음에는 일반 서버로, 두 번째를 백업 서버로 두 번 호출한다고 가정했습니다. 이제 이것을 시도하고 AsyncTask를 서버와 두 포트를 모두 지정하여 시작하십시오. 즉, BackgroundTask (NrmSrvAddress, NrmSrvPort, bckSrvAddress, bckSrvPort);

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

아이디어에 감사드립니다. 나는 그것을 시도했지만 여전히 같은 문제가 붙어있다. –

+1

내 대답을 다시 읽고, 나는 더 많은 라인을 추가했다. –

0

클라이언트 코드에서 java.net.SocketException 예외를 잡는 것은 어떻습니까? 서버가 다운 된 경우 보조 서버에 연결할 것인지 결정할 수 있는지에 따라 SocketException을 얻어야합니다.

관련 문제