Java中是否有缓冲填充接收方法?

时间:2015-11-02 01:11:15

标签: java sockets blocking

我习惯在C ++中使用Winsock,我有一个服务器应用程序,用于发送和接收类似于HTTP格式的标题的数据。

当我在c ++中使用带有足够大缓冲区的recv()时,我将始终收到整个数据包......

DataStreamInput.read()的行为是否相似?我还没有收到消息,我想我在重复阅读之前没有收到整条消息......

正如我在Windows上为Android编写的那样,调试起来很困难,只是想知道是否有更接近我的C ++代码的方式?

3 个答案:

答案 0 :(得分:1)

DataInputStream.read(byte[])将读取任意数量的字节,直到传入的字节数组长度并返回。读取的字节数将是返回值,如果已到达流的末尾,则为-1。调用将阻塞,直到某些字节可用,到达流的末尾或发生IOException。

您需要检查返回值以查看读取了多少字节,如果您需要更多数据,请继续调用它,直到您拥有所需的所有数据。

如果您知道实例需要100个字节

InputStream in = ...
byte b = new byte[100]
int c = 0;
int read = 0;
while(c < b.length && read != -1){
   read = in.read(b, c, b.length - c)
   if(read != -1)
     c += read;
   } 
}

答案 1 :(得分:0)

您可以在发送文件之前执行类似的操作:outToServer.writeInt(sendData.length);

然后当你收到文件时读取长度并将其用作长度?

int dataLength = dis.readInt()
  byte[] receivedData = new byte[dataLength];

我可能不会理解这个问题

答案 2 :(得分:0)

  

Java中是否存在阻塞类型的套接字?

是。所有java.net都在封锁。但这不是你真正要求的。您要求的是一种将填充缓冲区的读取方法。你正在寻找的是由DataInputStream.readFully()提供的,尽管你在断言recv()总是用C ++填充缓冲区时是错误的。它没有,并且在某些情况下它不能:当缓冲区大小超过套接字接收缓冲区的大小时。