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

I/O in JAVA - reading data from java.net.Socket

我在 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.

在整个字节缓冲区填满或到达流结束之前,此方法不会阻塞。相反,它 returns 当前可用的数据。

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

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

您可以使用 read(buf, start, len),而不是从缓冲区的开头开始,而是继续数据块。例如,如果您正在读取 正好 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"。当您找到它时 - 停止阅读并处理消息。

我建议使用 jgroups (http://www.jgroups.org/manual/html/index.html) 从 jboss 到 tcpip 通信