gpt4 book ai didi

java - JAVA中的I/O - 从java.net.Socket读取数据

转载 作者:行者123 更新时间:2023-12-02 04:52:10 24 4
gpt4 key购买 nike

我用 JAVA 开发的客户端-服务器应用程序有问题。我使用 java.net* 包中的 SocketServerSocket 。当客户端连接到服务器时,客户端发送消息,例如 7200 字节。在服务器中我使用InputStream。有时我会收到整个消息(7200 字节),但很多时候我收到的消息少于 7200 字节。 JAVA中有没有办法接收整个消息并关闭连接?也许我应该在 JAVA 中使用其他库来进行 tcp/ip 连接?

最佳答案

这可能会有所帮助:InputStream.read()文档。

Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes actually read is returned as an integer.

在整个字节缓冲区填满或到达流末尾之前,此方法不会阻塞。相反,它会返回当前可用的尽可能多的数据。

从文件读取时不太可能发生这种情况,但对于套接字来说很正常。

返回写入字节缓冲区的实际字节数,以便您可以确定是否有足够的数据。

您可以使用 read(buf, start, len),不从缓冲区开头开始,而是继续数据 block 。例如,如果您正在读取恰好 7200 字节,请执行以下操作:

byte [] buf = new byte[7200];
int len = 7200;
int pos=0;

while(len > 0) {
int rd = is.read(buf, pos, len);
if(rd<0) {
//premature EOF
break;
}
pos += rd;
len -= rd;
}

否则,如果您事先不知道消息长度,您有多种选择。其中:

  1. 发送消息长度为前 4 个字节,然后始终先读取 4 个字节,然后分配所需大小的缓冲区并读入其中
  2. 读入缓冲区,直到收到“END-OF-MESSAGE”标记。例如“END-OF-LINE”。当您找到它时 - 停止阅读并处理消息。

关于java - JAVA中的I/O - 从java.net.Socket读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29130126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com