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

时间:2015-03-18 18:38:10

标签: java sockets tcp ip

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

2 个答案:

答案 0 :(得分:2)

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

  

从输入流中读取一些个字节,并将它们存储到缓冲区数组b中。实际读取的字节数以整数形式返回。

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

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

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

您可以使用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”。当你找到它时 - 停止阅读并处理消息。

答案 1 :(得分:0)

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