Я бы попробовал вызвать этот метод вместо flush:
public boolean checkError()
Returns:
True if and only if this stream has encountered an IOException other than InterruptedIOException, or the setError method has been invoked
Посмотрите, не происходит ли сбой по какой-либо причине сброса (checkError вызывает внутреннюю очистку и запоминает состояние ошибки).
Также стоит попробовать подключиться к серверу с помощью telnet и посмотреть, возвращаются ли данные немедленно, или написать простую программу-сокет Java-клиента для проверки (вырезать / вставить одну из сети).
Возможно, браузер решил сознательно дождаться большего ввода, прежде чем отображать ваш html (особенно, если html сформирован не полностью). Кажется, я помнил, что сам сталкивался с этой проблемой в прошлом.