我已经创建了一个用于服务器客户端通信的套接字编程。
我正在使用 DataInputStream
的 read(byte[])
读取数据,还使用 DataOutputStream 的
。write(byte[])
写入数据
每当我发送少量数据时,我的程序都能正常工作。 但是,如果我发送 20000 个字符的数据并发送 10 次,那么我能够完美地接收数据 8 次,但不是 2 次。
那么我能否在套接字编程中使用读写可靠地发送和接收数据?
最佳答案
我的猜测是,您正在向 read()
发出单个调用,并假设它将返回您请求的所有数据。流通常不会那样工作。它会阻塞,直到有一些数据可用,但它不会等到有足够的数据来填充数组。
通常这意味着循环。例如:
byte[] data = new byte[expectedSize];
int totalRead = 0;
while (totalRead < expectedSize)
{
int read = stream.read(data, totalRead, expectedSize-totalRead);
if (read == -1)
{
throw new IOException("Not enough data in stream");
}
totalRead += read;
}
如果您一开始就不知道需要多少字节,您可能还想继续循环,但这一次直到 read()
返回 -1。使用缓冲区(例如 8K)读取和写入 ByteArrayOutputStream
。读取完毕后,您可以从 ByteArrayOutputStream
中获取字节数组形式的数据。
关于java - 套接字通信中大数据的读写方法不能可靠地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/780373/