1

我正在开发一种工具来获取客户端信息、发送到服务器并再次接收信息(代理)。我也在尝试转储从服务器接收到的数据。我可以读取 inputStream 的整数表示,但无法读取字符串格式。我试过下面的例子,但它挂起并且永远不会连接到服务器。此外, System.out.println(inputStream.nextLine()) 仅显示一行并挂起。

public void run() {
   try {
       int i;
       while ((i = inputStream.read()) != -1){
           System.out.println(IOUtils.toString(inputStream));
           outputStream.write(i);
       }
   } catch (IOException e) {
       System.out.println("Lost connection to the client.");
   }
}
4

2 回答 2

1
  1. 您发布的代码不会尝试连接到服务器,但如果其中任何一个执行,您必须已经连接。
  2. 如果您的程序挂在此代码中,则服务器尚未发送任何数据,或者该IOUtils.toString()方法可能会尝试读取 EOS,因此如果对等方没有关闭连接,您将永远阻塞在这里。
  3. 如果您的程序在 readLine() 调用时挂起,则意味着对等方尚未发送要读取的行。
于 2013-10-20T23:51:23.207 回答
1

我的猜测是您正在从输入流中读取,然后也使用 IOUtils 库从流中读取。我怀疑您的应用程序正在从输入流中读取第一个字节,然后使用 IOUtils 库读取输入流的其余部分,然后打印出读取的初始字节。

从循环中调用 IOUtils.toString(inputstream) 没有任何意义。该方法调用会将输入流中的所有数据放入一个字符串中。为什么在这种情况下有循环?

您可能想尝试不为此使用 IOUtils 库。只需读取一个字节的数据,将其推入 StringBuilder,然后打印该字节。在这种方法中,循环是必要的,你可能会得到你想要的东西。

尝试这样的事情,但根据需要修改它以同时将数据打印到输出流:

public static String inputStreamToString(final InputStream is, final int bufferSize)
{
  final char[] buffer = new char[bufferSize];
  final StringBuilder out = new StringBuilder();
  try {
    final Reader in = new InputStreamReader(is, "UTF-8");
    try {
      for (;;) {
        int rsz = in.read(buffer, 0, buffer.length);
        if (rsz < 0)
          break;
        out.append(buffer, 0, rsz);
      }
    }
    finally {
      in.close();
    }
  }
  catch (UnsupportedEncodingException ex) {
    /* ... */
  }
  catch (IOException ex) {
      /* ... */
  }
  return out.toString();
}
于 2013-10-21T02:57:33.787 回答