Вы почти наверняка не хотите использовать DataOutputStream
в ответе - и writeUTF
определенно не будет делать то, что вы хотите. DataOutputStream
в основном предназначен для двоичных протоколов, а writeUTF
записывает строку UTF-8 с префиксом длины, в то время как HTTP просто хочет завершить CRLF строки текста ASCII.
Вы хотите записать заголовки из строки за один раз - поэтому создайте OutputStreamWriter
вокруг выходного потока сокета и напишите в него:
writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Date: Tue, 11 Jan 2011 13:09:20 GMT\r\n");
и т.д.
Возможно, вы захотите написать свой собственный метод writeLine
, чтобы написать строку, включая CRLF в конце (не используйте системный терминатор строки по умолчанию), чтобы сделать код чище.
Добавьте также пустую строку между заголовками и телом, и тогда вы будете в разумной форме.
РЕДАКТИРОВАТЬ: еще два изменения:
Во-первых, вы должны прочитать запрос от клиента. Например, измените din
на BufferedReader
и инициализируйте его следующим образом:
din = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),
"ASCII"));
затем, прежде чем начать писать вывод, прочитайте запрос следующим образом:
String line;
while ((line = din.readLine()) != null) {
System.out.println("Read " + line);
if (line.length() == 0) {
break;
}
}
EDIT: как отмечено в комментариях, это не подходит для полноценного HTTP-сервера, так как он не будет хорошо обрабатывать двоичные данные PUT / POST (он может считывать данные в свой буфер, то есть вы не сможете читать как двоичные данные из потока). Впрочем, для тестового приложения это нормально.
Наконец, вы также должны либо закрыть выходной модуль записи, либо хотя бы очистить его - в противном случае он может буферизовать данные.
После внесения этих изменений ваш код сработал для меня.