Проблема в том, что ваши данные поступают кусками. Либо размер пакета ограничивает это, либо, возможно, DataInputStream имеет внутренний буфер только 40 КБ. Я не знаю, но это не имеет значения. В любом случае, все 1000000 байтов не будут получены сразу. Таким образом, вы должны переписать вашу программу, чтобы ожидать этого. Вам нужно прочитать полученные меньшие порции и сохранить их в другой байтовой переменной [1000000] (отслеживая, где находится ваш последний индекс байтов). Продолжайте цикл, пока вы не закончили читать сокет. Затем вы можете работать со своей внутренней переменной.