Java 一种可靠的套接字数据读取方法

Java 一种可靠的套接字数据读取方法,java,android,tcp,Java,Android,Tcp,我正在处理的应用程序有两个部分。服务器部分在Linux机器上运行。客户端是一个Android应用程序,查询服务器并获得必要的响应。这两部分都是用Java编写的,使用基于套接字的通信,并传输文本数据 在发送请求之后,以下是客户端接收响应的方式: public static String ReadAvailableTextFromSocket(BufferedReader input) throws IOException { if (input.ready() == false) {

我正在处理的应用程序有两个部分。服务器部分在Linux机器上运行。客户端是一个Android应用程序,查询服务器并获得必要的响应。这两部分都是用Java编写的,使用基于套接字的通信,并传输文本数据

在发送请求之后,以下是客户端接收响应的方式:

public static String ReadAvailableTextFromSocket(BufferedReader input) throws IOException {
  if (input.ready() == false) {
    return null;
  }
  StringBuilder retVal = new StringBuilder();
  while(input.ready()) {
    char ch = (char) input.read();
    retVal.append(ch);
  }
  return retVal.toString();
}
然而,这似乎并不那么可靠。由于服务器响应时间或传输延迟,输入并非总是准备就绪

看起来input.ready()不是等待获取数据的正确方法

我想知道是否有更好的方法来实现这一点。也许我可以使用一些标准做法。

也许你应该使用。将侦听器线程保持在
while(true)
循环中,该循环在数据进入时读取更多数据,并简单地将数据缓冲在与主线程共享的数据结构(比如队列)中。这样,主线程就可以根据需要简单地将数据出列。如果队列为空,则可以推断未收到新数据


编辑:以此代码为例。

以下是我如何解决此问题的。由于我负责编写客户端和服务器端,当请求到达服务器时,作为响应发送的第一行信息是客户端可以期望的字节数。这样,客户机首先等待读取一行。一旦读取了该行,客户机现在就知道需要从服务器读取多少字节的数据

希望这能帮助别人


问候,
彼得

谢谢你的帮助。当前正在后台线程中接收数据。然而,我认为这个问题仍然没有消失。一些线程,无论是后台线程还是前台线程,都必须等待一定的时间,然后决定数据不会出现。我想我可能需要介绍一下等待数据的时间。