Может ли сервер знать, что клиент завершил отправку своих данных и теперь готов к ответу - независимо (и без знания) протокола приложения?
Редактировать: подумать о созданиипрокси-сервер.Вы не можете влиять на протоколы, вы не знаете аппликативных деталей каждого протокола (поэтому вы не знаете, когда поток «заканчивается»).Относительно "клиент может закрыть входной поток" - это правда, но, очевидно, клиенты фактически не закрывают поток (имеет отношение к повторному использованию?).Это эмпирически проверено с веб-браузерами.
Возможно, я лаю не на то дерево - для этого сценария прокси-сервера не будет достаточно копирования потока в выходной поток «другого конца»?Однако как другой конец «узнает», что поток закончился?
См. Эту программу:
public class Test {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8081, 100, InetAddress.getByName("localhost"));
final Socket socket1 = new Socket("www.google.com", 80);
final Socket socket = serverSocket.accept();
new Thread(new Runnable() {
public void run() {
try {
final InputStream inputStream = socket1.getInputStream();
final OutputStream outputStream = socket.getOutputStream();
readwrite(inputStream, outputStream, false);
} catch (IOException e) {
e.printStackTrace();
}
}
});
final InputStream inputStream = socket.getInputStream();
final OutputStream outputStream1 = socket1.getOutputStream();
readwrite(inputStream, outputStream1, true);
}
private static void readwrite(InputStream inputStream, OutputStream outputStream1, boolean x) throws IOException {
final byte[] bytes = new byte[4];
int read = -1;
while ((read = inputStream.read(bytes)) != -1) {
System.out.println((x?"s ":"r ") + new String(bytes));
outputStream1.write(bytes, 0, read);
}
}
}
Вместо того, чтобы делать то, что, как вы думаете, будет (прокси для www.google.com) просто зависает.Поток, который должен читать из Google и записывать в локальный сокет, не обнаруживает ничего в этом входном потоке.
Edit2: DOH!поставь меня в тупой уголЗабыл "начать" тему.Возвращаясь к моему первоначальному вопросу - как я узнаю, что поток закончился?
Edit3: Ну, моя проблема была совсем другой (касался POST, Transfer-Encoding и HttpClient-annoying-internal-cache-что-мо-быть выключенным).Справедливости ради, я приму ответ, который лучше всего отвечает на исходный вопрос.