java - 套接字通信中大数据的读写方法不能可靠地工作

标签 java sockets

我已经创建了一个用于服务器客户端通信的套接字编程。 我正在使用 DataInputStreamread(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/

相关文章:

java - 反射可以改变字段的声明类型吗

Java搜索表单查询IP号码

java - JBOSS 6.0如何解决ear文件之间的类加载问题?

c - IP 地址 char* 变量在循环从 ifa_addr 收集地址时意外更改

database - 关于使用 Delphi XE2 进行数据库编程的问题

node.js - Node : Data sent acknowledgement to TCP server

java - 由 View 扩展的自定义 View 类的属性不起作用

java - 已签名未签名小程序/Java Web Start、套接字连接?

sockets - 文件流遇到缓冲区欠载/下溢?

Java:在不同的文件夹中导入我自己的包