繁体   English   中英

JAVA中的I / O-从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()文档。

读取从输入流一定数量的字节,并将其存储到缓冲数组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”。 找到它后-停止阅读并处理消息。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM