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

时间:2012-02-24 18:34:48

标签: java android tcp

我正在处理的应用程序有两个部分。服务器部分在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()不是等待获取数据的正确方法。

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

2 个答案:

答案 0 :(得分:0)

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

修改:请参阅此multithreaded chat server/client代码作为示例。

答案 1 :(得分:0)

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

希望这有助于其他人。

的问候,
彼得