Это не останавливается, потому что
if (i == 1) {
в вашем источнике сервера должно быть
if (i == -1) {
Или, если вы хотите быть действительно безопасным:
if (i <= 0) {
Кроме того, вы рискуете испортить данные с помощью этой строки:
os.write(mybytearray, 0, mybytearray.length);
Вы должны изменить это на:
os.write(mybytearray, 0, i);
По производительности - переместите вызов os.flush();
за пределы while
петля.Когда вы очищаете сетевой поток, вы заставляете его отправлять любые буферизованные данные в сеть.Это заставляет сетевой уровень отправлять и подтверждать 1024-байтовые полезные нагрузки TCP (конечно, большие Ethernet-нагрузки), которые, вероятно, значительно меньше, чем ваш PMTU.Вам нужно очищать только когда вы закончите отправку данных, или когда вы хотите, чтобы клиент получил буферизованные данные сейчас .Удаление вызова очистки из каждой итерации позволит сетевому буферу уровня ОС выполнять свою работу и сегментировать данные на как можно меньшее количество пакетов.