Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Socket reading using BufferedInputStream

I'm using Java's BufferedInputStream class to read bytes sent to a socket. The data to the socket is HTTP form so generally is a header with defined content-length, then some content.

The problem I'm having is that sometimes BufferedInputStream.read() will not read the full amount of data sent to it. It returns the number of bytes read but this is much less than has been sent. I have verified the bytes sent with Wireshark and can confirm the full message is being transmitted.)

Sample code below:

BufferedInputStream inFromClient = new BufferedInputStream(socket.getInputStream());
int contentLength = getContentLengthFromHeader();    
byte[] b = new byte[contentLength];
int bytesRead = inFromClient.read(b, 0, contentLength);

Once read() is finished sometimes bytesRead is equal to contentLength but on other occasions read() does not seem to read as far as the end of the content. Does anyone have any ideas on what is happening? Is Java buffering output? Are there better ways of reading from sockets?

like image 564
Adam Avatar asked Nov 10 '22 14:11

Adam


1 Answers

You're assuming that read() fills the buffer. Check the Javadoc. It transfers at least one byte, that's all it says.

You don't need both a large buffer and a BufferedInputStream. Change the latter to DataInputStream.readFully().

like image 106
user207421 Avatar answered Nov 14 '22 23:11

user207421