【问题标题】:Why InputStream is stopping my application?为什么 InputStream 正在停止我的应用程序?
【发布时间】:2014-03-02 07:36:42
【问题描述】:

我有一个在套接字连接之间与 Java 服务器通信的 Android 应用程序。当服务器运行时,没有问题。我从 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();
          }
        }

    }

【问题讨论】:

  • 是否抛出任何错误或异常?
  • 这对你来说也可能很有趣:stackoverflow.com/questions/9525972/…
  • 无错误,无异常。日志什么也没显示。只是应用程序显示一个对话框说它停止并询问我是要关闭应用程序还是等待
  • 我去看看 Ben,谢谢!
  • 我已经尝试过 Ben,它对我没有任何效果

标签: java android sockets timeout inputstream


【解决方案1】:

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

【讨论】:

  • 我不确定这是否是我的问题的答案。我的意思是,我从 android 发送代码,通过服务器,然后以指定的方式在 android 中取回它。但是如果服务器没有运行,应用程序就会停止响应。我想它不会发生,因为这个函数被捕获在一个线程中。
猜你喜欢
  • 2017-12-04
  • 2021-08-14
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2022-10-13
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多