Ваша самая большая проблема в том, что вы вызываете is.read (в байтах) несколько раз, в то время как байты потенциально могут прочитать весь файл за один раз.Следовательно, повторный вызов не имеет смысла ограничивать число считываемых байтов до фактической длины файла.Следовательно, он читает больше, чем просто отправленный файл, и проглатывает строки, отправленные после файла, тем самым нарушая ваш протокол.На некоторых машинах для достаточно маленьких файлов файл может быть прочитан за один раз, таким образом, не считывая больше байтов, чем ожидалось, и не нарушая ваш протокол.Но это просто случайная встреча.Вы не можете полагаться на это.
Вы должны будете указать read () не читать больше байтов, чем оставшееся число, чтобы прочитать файл.
Не так очевидно, что вы не можете обернутьInputStream или OutputStream из сокета, затем повторно используйте тот же развернутый InputStream или OutputStream.Когда вы это сделаете, это будет работать, пока вы не запустите в угловых случаях, когда он не запускается.
Например, в клиентском коде вы оборачиваете InputStream в BufferedReader для чтения строк, затемв какой-то момент вы используете InputStream напрямую для чтения байтов файлов.Вы не можете сделать это.BufferedReader имеет слабые правила о том, что составляет и конец строки, и будет принимать и использовать самое длинное из \ r, \ n, \ f или \ r \ n.Если сервер работает в странной системе, подобной Mac, и его концы строк имеют вид \ r, но затем вы отправляете файл, в котором первый байт равен \ n, тогда клиент получит \ r с концастроки, затем \ n из файла, и рассмотрите последовательность обоих как фактический конец строки.Таким образом, вы прочитали и использовали первый байт файла, что повредит его начало и заставит вас прочитать еще один байт в конце файла и испортить ваш протокол.Не будет работать.
Подобные проблемы всегда будут существовать, если вы не ожидаете их, если будете использовать объекты InputStream или OutputStream как в обернутом, так и в развернутом виде.Вы не можете сделать это и ожидать, что это будет работать правильно.