为什么InputStream会停止我的应用程序?

时间:2014-02-05 17:45:58

标签: java android sockets timeout inputstream

我有一个Android应用程序,它在套接字连接之间与Java服务器通信。当服务器运行时,没有问题。我发送一些来自Android和服务器的回答。我得到回应并把它放在Toast中。看起来很棒!但是,如果我停止运行服务器,Android会等待回答并且所有应用程序都停止运行。奇怪的是应用程序在一个线程内运行,所以我认为它不应该发生。我想知道是否有某种方法可以避免它崩溃应用程序和某些方式来说明应用程序的用户服务器没有响应。对不起,如果有一些愚蠢的错误,我只是Java新手。代码:

        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();
          }
        }

    }

1 个答案:

答案 0 :(得分:0)

您正在使用println()发送已包含换行符的行。这将导致发送两个换行符,这可能会使对等点混淆并可能导致它返回意外的内容,而您的代码可能无法正确处理。