Я пытаюсь передать текстовый файл на другой сервер с использованием TCP, и он ведет себя по-другому, чем ожидалось. Код отправки данных является:InputStream in.read() ведет себя иначе, чем ожидалось
System.out.println("sending file name...");
String outputFileNameWithDelimiter = outputFileName + "\r\n"; //These 4 lines send the fileName with the delimiter
byte[] fileNameData = outputFileNameWithDelimiter.getBytes("US-ASCII");
outToCompression.write(fileNameData, 0, fileNameData.length);
outToCompression.flush();
System.out.println("sending content...");
System.out.println(new String(buffer, dataBegin, dataEnd-dataBegin));
outToCompression.write(buffer, dataBegin, dataEnd-dataBegin); //send the content
outToCompression.flush();
System.out.println("sending magic String...");
byte[] magicStringData = "--------MagicStringCSE283Miami".getBytes("US-ASCII"); //sends the magic string to tell Compression server the data being sent is done
outToCompression.write(magicStringData, 0, magicStringData.length);
outToCompression.flush();
Поскольку это TCP, и вы не можете отправлять отдельные пакеты, как и в UDP, я ожидал, все данные, чтобы быть во входном потоке, и я мог бы просто использовать разделители для разделения имя файла, содержимое и конец строки, а затем каждый in.read() просто даст мне следующий последующий объем данных.
Вместо этого данные я получаю на каждое чтение:
On the first in.read() byteBuffer appears to only have "fileName\r\n".
On the second in.read() byteBuffer still has the same information.
On the third in.read() byteBuffer now holds the content I sent.
On the fourth in.read() byteBuffer holds the content I sent minus a few letters.
On the fifth in.read() I get the magicString + part of the message.
Я промывке на каждый отправить с веб-сервера, но входные потоки, похоже, не для реализации Смываемый.
Может ли кто-нибудь объяснить, почему это происходит?
EDIT: Вот как я читаю вещи. В основном это в цикле, а затем записывается в файл.
in.read(byteBuffer, 0, BUFSIZE);
Можете ли вы показать, как вы читаете с 'in' на стороне клиента? У меня есть сильное подозрение, что вы не проверяете возвращаемое значение 'in.read() '(количество байтов, фактически считанных из потока). – dddsnn
Я не, но зачем это проверять? Разве это не просто позволит мне отлаживать его (мне кажется, что проблема in.read() заключается в том, что, увидев, что счет будет полезен), не объясните, почему он действует как таковой? Проводка кода сейчас. – Xerunix
Я бы не послал волшебную нить, но заранее, если вы это знаете. И вы должны рассматривать tcp как поток, а не как пакеты (т. Е. На входе могут быть разные куски, чем полученные чтения). – eckes