Как SocketChannel узнает, когда чтение файла завершено? - PullRequest
1 голос
/ 15 мая 2009

Я использую канал сокета и концепцию NIO для чтения данных из клиента.
Как Socket Channel узнает, когда чтение файла завершено?

ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE);
int nbytes = socketChannel.getChannel().read(byteBuffer);

Я читаю данные все сразу, если данные маленькие, но если данные большие, я читаю данные по фрагментам и, наконец, получаю те же данные, теперь я хочу узнать, как канал понимается как конец данных
Могу ли я узнать, когда чтение файла завершено?

1 Ответ

4 голосов
/ 15 мая 2009

Существует три основных варианта:

  • Протокол может указывать, что длина файла должна предшествовать данным.
  • Протокол может указывать некоторый маркер "конца файла" (который, конечно, должен быть недействительным для данных в файле)
  • Сервер может закрыть сокет после завершения: ваш read вызов вернет -1, чтобы вы знали, когда все данные были прочитаны

По сути, при потоковой передаче данных нельзя полагаться на все данные, поступающие в определенном количестве запросов.

Какой протокол вы используете, и можете ли вы изменить его соответствующим образом? Префикс длины обычно является самым простым решением.

...