2014-02-05 3 views
0

나는 소켓 연결 사이에 자바 서버와 대화하는 안드로이드 애플 리케이션을 가지고있다. 서버가 실행 중일 때는 문제가 없습니다. 나는 안드로이드와 서버 대답에서 무언가를 보냅니다. 나는 응답을 받고 토스트에 넣는다. 멋지다! 하지만 서버를 실행하지 않으면 Android는 응답을 기다리고 모든 애플리케이션이 작동을 멈 춥니 다. 이상한 사실은 스레드 내에서 실행중인 응용 프로그램, 그래서 그 일이 일어나지 않아 생각합니다. 나는 그것이 응용 프로그램과 응용 프로그램의 사용자에게 서버가 응답하지 않는다고 말할 수있는 어떤 방법으로 응용 프로그램을 중단시키는 것을 피할 수있는 방법이 있는지 알고 싶습니다. 어리석은 실수가 있다면 미안 해요, 자바에서 방금 새로운 것 같아요. 코드 :왜 InputStream이 응용 프로그램을 멈추고 있습니까?

 public void onClick(DialogInterface dialog, int whichButton) { 

      InetAddress ia; 
      try { 

       ia = InetAddress.getByName("192.168.3.101"); 
       s = new Socket(ia,12346); 
       Thread t = new Thread(new doComms(s)); 
       t.start(); 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     }}); 

그리고 클래스 doComms :

class doComms implements Runnable { 

     private Socket s; 
     String line,inp; 

     doComms(Socket server) { 
      this.s=server; 
     } 

     public void run() { 

      inp=""; 

      try { 
      // Get input from the client 
      DataInputStream in = new DataInputStream (s.getInputStream()); 
      PrintStream out = new PrintStream(s.getOutputStream()); 
      out.println(input.getText().toString()+"\n."); 


      while((line = in.readLine()) != null && !line.equals(".")) { 
       inp=inp + line; 
      } 

      runOnUiThread(new Runnable() { 
       public void run() { 
        if(inp.equals("ok")){ 
         Toast.makeText(Inicio.this,"Mensagem enviada com sucesso",Toast.LENGTH_LONG).show(); 
        }else{ 
         Toast.makeText(Inicio.this,"Falha ao enviar mensagem",Toast.LENGTH_LONG).show(); 
        } 
       } 
      }); 

      Log.v("inp", inp); 
      Log.v("type",inp.getClass().toString()); 

      s.close(); 


      } catch (IOException ioe) { 
      System.out.println("IOException on socket listen: " + ioe); 
      ioe.printStackTrace(); 
      } 
     } 

    } 
+0

오류 또는 예외가 발생합니까? –

+0

이것은 또한 당신에게 흥미로울 수 있습니다 : http://stackoverflow.com/questions/9525972/add-a-timeout-when-creating-a-new-socket – Ben

+0

오류가 없으며 예외는 없습니다. 로그에는 아무것도 표시되지 않습니다. 그냥 응용 프로그램이 멈추었다 고 말하는 대화 상자를 보여주고 내가 응용 프로그램을 닫거나 기다릴 것인지 묻는 메시지가 표시됩니다. –

답변

0

이미 줄 바꿈이 포함 된 라인을 보낼에 println()를 사용하고 있습니다. 그 결과 두 개의 개행 문자가 전송되어 피어를 혼동시킬 수 있으며 예기치 않은 결과가 반환 될 수 있으므로 코드가 올바르게 처리되지 않을 수 있습니다.

+0

이것이 내 문제에 대한 대답인지 잘 모르겠다. 내 말은, 나는 안드로이드에서 코드를 보내고, 서버를 지나가고, 안드로이드에서 스펙타클 한 방식으로 다시 얻는다. 그러나 서버가 실행되지 않으면 응용 프로그램이 응답을 중지합니다. 나는이 함수가 Thread 내부에 걸려서 발생하지 않을 것이라고 생각한다. –

관련 문제