Программирование на сокете: Как я могу прочитать указанное количество байтов из буфера?

TCP является потоковым протоколом. Чтобы преобразовать этот поток в мои сообщения, я отправляю размер каждого сообщения вместе с самим сообщением. На стороне сервера я сначала читаю первые два байта сообщения, которые имеют размер. Затем я создаю байтовый массив, размер которого равен размеру, который был только что прочитан. Затем я прочитал байты в этот массив. Но по какой-то причине читается больше байтов, чем указано. Как я могу прочитать ровно столько же байтов, сколько я укажу?

Вот мой код:

while (true)
{
    data = null;
    length = null;

    size = new byte[2];

    handler.Receive(size);

    length += Encoding.ASCII.GetString(size, 0, 2);
    System.Console.WriteLine("Size: " + Int32.Parse(length));

    bufferSize = Int32.Parse(length) + 2;
    bytes = new byte[bufferSize];

    handler.Receive(bytes);

    data += Encoding.ASCII.GetString(bytes, 0, bufferSize);
    System.Console.WriteLine("Data: " + data);
}

Это мой сервер, работающий на ПК с Windows, написанный на C #. Мой клиент работает на телефоне Android, написанном на Java.