Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从套接字读取所有数据_Java_Sockets_Asynchronous - Fatal编程技术网

Java 从套接字读取所有数据

Java 从套接字读取所有数据,java,sockets,asynchronous,Java,Sockets,Asynchronous,我希望同步读取所有数据,从客户端或服务器接收数据,而不使用java中的readline()方法(如c++中的readall())。 我不想使用下面的代码: BufferedReader reader = new BufferedReader(new inputStreamReader(socket.getInputStream())); String line = null; while ((line = reader.readLine()) != null) document.app

我希望同步读取所有数据,从客户端或服务器接收数据,而不使用java中的
readline()
方法(如c++中的
readall()
)。
我不想使用下面的代码:

BufferedReader reader = new BufferedReader(new inputStreamReader(socket.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null)
     document.append(line + "\n");

我应该使用什么方法?

如果您知道传入数据的大小,可以使用以下方法:

public int read(char cbuf[], int off, int len) throws IOException;
其中cbuf是目标缓冲区

否则,您必须读取行或字节。流不知道传入数据的大小。只能顺序读取,直到到达结束(read方法返回-1)

参考这里

诸如此类:

public static String readAll(Socket socket) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null)
        sb.append(line).append("\n");
    return sb.toString();
}

您可以使用以下内容:

   public static String readToEnd(InputStream in) throws IOException {
      byte[] b = new byte[1024];
      int n;
      StringBuilder sb = new StringBuilder();
      while ((n = in.read(b)) >= 0) {
         sb.append(b);
      }
      return sb.toString();
   }

我给你举了一个例子,因为还有一件更重要的事情需要注意:你应该使用StringBuilder而不是concatting字符串。+1注意:这将读取所有字符,如果有不完整的多字节字符,它将保留在缓冲区中,稍后会出现。@Tala,在过时的java优化技巧和java urban Mythos中,使用StringBuilder进行常规连接是过时的。您反对使用您发布的代码吗?为什么要获取所有数据?关于使用套接字的一个常见混淆是,假设它支持接收消息,并且如果您可以一次读取所有数据,那么您可以读取一整条“消息”。虽然这可能在TCP中在低负载下以及“消息”之间的时间间隔下工作,但TCP不支持这一点,并且在负载下也不能可靠地工作。如果您需要基于消息的协议,您可以尝试Java 7中的SCTP,或者按照预期的方式使用TCP作为流式协议。类似于浏览器从不发送null wile connected并等待响应。。。我想一次同步读取所有标题和数据@请再试一次。我完全听不懂那种胡言乱语。