【问题标题】:OutputStream not sending until socket is closedOutputStream 在套接字关闭之前不发送
【发布时间】:2015-05-14 15:51:36
【问题描述】:

您好,我正在开发一个用于使用套接字控制计算机的 android 应用程序,但我的问题是在我关闭输出流从而关闭套接字之前我无法从服务器获取数据,因此将无法再发送或接收数据。我的问题是如何在不关闭 OutputStream 的情况下将数据从服务器发送到客户端?

此代码用于关闭 OutputStream (ps1.close()):套接字已关闭

private class Receivecmd extends Thread{
        Scanner sc = null;
        @Override
        public void run() {
            Runtime r;
            try {
                sc = new Scanner(socket.getInputStream());
                while(true)
                {
                    if(sc.hasNext())
                    {
                        System.out.println("Got Some");
                        String sr = sc.nextLine();
                        if(sr.contains("shutdown "))
                        {
                            if(sr.contains("/h"))
                            {
                                sr = sr.replace("/t", "");
                            }
                            r = Runtime.getRuntime();
                            r.exec(sr+"/f");
                        }
                        else if (sr.contains("taskman"))
                        {
                            System.out.println("Task");
                            r = Runtime.getRuntime();
                            Process p = r.exec("tasklist.exe");
                            Scanner sc1 = new Scanner(p.getInputStream());
                            PrintStream ps1 = new PrintStream(socket.getOutputStream());
                            while(sc1.hasNext())
                            {
                                String s = sc1.nextLine();
                                ps1.println(s);
                                System.out.println(s);

                            }
                            ps1.close();

                        }
                        else if(sr.contains(".exe"))
                        {
                            r = Runtime.getRuntime();
                            r.exec(sr);
                            System.out.println(sr);
                        }


                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(AndroidServer.class.getName()).log(Level.SEVERE, null, ex);
            }
            super.run(); //To change body of generated methods, choose Tools | Templates.
        }

当我删除 ps1.close() 时此代码不起作用:我仍然可以接收数据

private class Receivecmd extends Thread{
        Scanner sc = null;
        @Override
        public void run() {
            Runtime r;
            try {
                sc = new Scanner(socket.getInputStream());
                while(true)
                {
                    if(sc.hasNext())
                    {
                        System.out.println("Got Some");
                        String sr = sc.nextLine();
                        if(sr.contains("shutdown "))
                        {
                            if(sr.contains("/h"))
                            {
                                sr = sr.replace("/t", "");
                            }
                            r = Runtime.getRuntime();
                            r.exec(sr+"/f");
                        }
                        else if (sr.contains("taskman"))
                        {
                            System.out.println("Task");
                            r = Runtime.getRuntime();
                            Process p = r.exec("tasklist.exe");
                            Scanner sc1 = new Scanner(p.getInputStream());
                            PrintStream ps1 = new PrintStream(socket.getOutputStream());
                            while(sc1.hasNext())
                            {
                                String s = sc1.nextLine();
                                ps1.println(s);
                                System.out.println(s);

                            }


                        }
                        else if(sr.contains(".exe"))
                        {
                            r = Runtime.getRuntime();
                            r.exec(sr);
                            System.out.println(sr);
                        }


                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(AndroidServer.class.getName()).log(Level.SEVERE, null, ex);
            }
            super.run(); //To change body of generated methods, choose Tools | Templates.
        }

【问题讨论】:

  • 为什么不想关闭流?
  • @JordiCastilla 当我关闭流时它会关闭套接字,因此我将无法再发送或接收数据
  • 这段代码发送正常,每次ps1 被刷新。接收代码是什么样的?
  • 看起来像:Scanner sc = new Scanner (socket.getInputStream); while (sc.hasNext ()){tasklist.add (sc.nextLine ();} (其中 tasklist 是一个字符串数组列表)
  • 太棒了。 taskList 是什么?没有收到数据的证据在哪里?

标签: android sockets outputstream


【解决方案1】:

使用flush()

通过将任何缓冲数据写入底层输出来刷新对象。

【讨论】:

    【解决方案2】:

    可能接收方会逐行处理输入,所以你应该追加一个。

    ps1.println();
    

    【讨论】:

    • 我不明白。我应该在哪里附加这一行。
    • 我不知道谁处理你的输出,以及以什么方式,但我假设它是逐行处理的。所以你应该在一个有意义的命令的末尾追加一个新行,否则接收者永远不会读取一行,除非你关闭输出流。
    【解决方案3】:

    我正在使用这个扫描器将从输入流中捕获的所有行放入一个名为 tasklist 的字符串数组列表中

    换句话说,您正在读取输入直到流结束,这仅在您关闭或关闭发送方的套接字时发生。

    您可以将其关闭以进行输出,但这意味着您只能执行这些请求/响应周期之一。您需要重新考虑您的应用程序协议。或者一次只处理一项任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多