To expand on Luc's excellent information, the opposite is also true of the data being spread across multiple packets. If multiple pieces of data are sent that are small, depending on how the OS decides to use it's internal buffers, it may combine one of more and send them as 1 packet. So, you can see that you have to have some way to sort it out on the receiving end since it may be received completely differently than how it was sent. One approach is to create your own mechanism, or protocol, for transmitting data. A common technique is to perform 2 transmissions, the first is a small amount of data that contains the size of the data to be sent (can be just 4 bytes representing an Int32). And then the second transmission is the actual data. So, on the client end the first transmission would tell the client to expect N bytes of data. Then the client can read until all N bytes are received.
Keep It Simple Stupid! (KISS)