Java 从套接字读取所有数据
我希望同步读取所有数据,从客户端或服务器接收数据,而不使用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
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并等待响应。。。我想一次同步读取所有标题和数据@请再试一次。我完全听不懂那种胡言乱语。