我正在开发一个工具来获取客户端信息,发送到服务器,然后再次接收信息(代理)。我还试图转储从服务器接收的数据。我可以读取输入流的整数表示形式,但我无法读取字符串格式。我尝试了下面的示例,但它挂起并且从未连接到服务器。此外,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.");
}
}
我的猜测是,您正在从输入流中读取,然后使用 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();
}
- 您发布的代码不会尝试连接到服务器,但如果其中任何代码执行,则必须已连接。
- 如果您的程序在此代码中挂起,则服务器尚未发送任何数据,或者
IOUtils.toString()
方法可能尝试读取EOS,因此,如果对等方不关闭连接,您将永远阻止此处。 - 如果你的程序在readLine()调用时挂起,这意味着对等方没有发送一行来读取。