2010-03-03 4 views
0

В настоящее время я работаю над прокси-сервером, который получает HTTP-запрос от браузера, обрабатывает его, а затем перенаправляет его на веб-сервер желания.Java socket programming - stream get stuck

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

Мой код на самом деле очень просто, как показано ниже:

ServerSocket servSocket = new ServerSocket(8282); 
Socket workSocket = servSocket.accept(); 
InputStream inStream = workSocket.getInputStream(); 
byte[] buffer = new byte[1024]; 
int numberRead = 0; 

while ((numberRead = inStream.read(buffer, 0, 1024)) != -1){ 
System.out.println(new String(buffer)); 
} 

Цикл просто не может выйти, даже прием запроса закончена.

Есть ли способ обхода этой проблемы?

Заранее благодарим за любые советы.

+0

вам необходимо предоставить информацию и, скорее всего, также исходный код, чтобы мы могли найти проблему. –

+0

Код добавлен, пожалуйста, совет. –

+0

Почему бы просто не настроить Apache HTTPD и mod_proxy? – pjp

ответ

0

Он будет работать до тех пор, пока соединение не будет закрыто, и клиент, вероятно, ждет ответа HTTP от вас и не закрывает его.

+0

В этом случае, похоже, что у меня нет способа обрабатывать запрос, кроме использования потоков? –

+0

Ну, вы можете использовать выборочное и неблокирующее чтение/запись - в этом случае будет один поток. Я не эксперт по Java, хотя и не могу дать вам больше деталей. –

1

Как и в случае InputStream javadoc, метод блокируется до тех пор, пока данные не будут доступны или не будет обнаружен EOF. Таким образом, другая сторона Socket должна закрыть его - тогда будет возвращаться вызов inStream.read().

Другой способ - отправить размер сообщения, которое вы хотите прочитать первым, так что вы знаете, сколько байтов вы должны прочитать. Или вы можете использовать BufferedReader для чтения из сокета по-линии. BufferedReader имеет метод readLine(), который возвращается каждый раз, когда строка считывается, что должно работать для вас, поскольку пакеты протокола HTTP приятно разделены на строки.

+0

Однако клиент, подключающийся к сокету, является браузером, таким как firefox или IE. У меня нет средств управлять браузером, не закрывая сокет и не отправляя размер сообщения в начале. –

+0

Итак, я бы предложил использовать BufferedReader.Каждый HTTP-пакет разделен на строки, поэтому вы прочитаете пару строк и сможете сказать, является ли это всем пакетом (он всегда будет заканчиваться символом новой строки). – pajton

+0

Я попробовал подход BufferedReader, но поток все еще держится. –

0

Браузер ожидает ответа, прежде чем он закроет соединение. Ваш метод чтения, с другой стороны, будет блокироваться до тех пор, пока поток/соединение не будет закрыто или не будут получены новые данные.

0

Непрерывное решение в соответствии с вашим текущим кодом.

Поскольку HTTP - это протокол на основе строк, вы можете использовать Buffered Reader и позвонить по нему readLine().

+0

Я пробовал подход BufferedReader, но поток все еще держится. –

0

когда приходит запрос HTTP в нем будет всегда быть заключен с пустой строкой, например:

GET /someFile.html HTTP/1.1 
Host: www.asdf.com 

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