Прием данных сервлетом
От: jokingless Украина  
Дата: 13.03.08 12:10
Оценка:
С программы клиента идет такое обращение(часть кода):

conn = (HttpURLConnection) new URL(HOST_URL).openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setDoOutput(true);
final OutputStream outputStream = conn.getOutputStream();
try
{
outputStream.write(CLIENT_IDENT_NUM.concat(command).getBytes());
outputStream.flush();
}
finally
{
outputStream.close();
}


На сервлете чтение данных:
ServletInputStream is = request.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
String result = null;
while( (result = reader.readLine()) != null) {
}


Суть ошибки: данные не считываются (строка result — пустая и тип исключения String:nulljava.lang.NullPointerException ), при этом обращение к сервлету осуществляется т.к. метод doPost выполняется. Помогите, пожалуйста, поправить код, либо подскажите лучший вариант реализации. Заранее спасибо.
Утратив все мы обретем свободу (с) Тайлер Дерден
Re: Прием данных сервлетом
От: stenkil  
Дата: 13.03.08 12:22
Оценка:
Здравствуйте, jokingless, Вы писали:

J>На сервлете чтение данных:

J>
J>ServletInputStream is = request.getInputStream();
J>BufferedReader reader = new BufferedReader(
J>new InputStreamReader(is));
J>String result = null;
J>while( (result = reader.readLine()) != null) {
J>}
J>


А до вызова request.getInputStream() чтение параметров из request не делал ?
Re: Прием данных сервлетом
От: Blazkowicz Россия  
Дата: 13.03.08 12:23
Оценка:
Здравствуйте, jokingless, Вы писали:

J>Суть ошибки: данные не считываются (строка result — пустая и тип исключения String:nulljava.lang.NullPointerException ), при этом обращение к сервлету осуществляется т.к. метод doPost выполняется. Помогите, пожалуйста, поправить код, либо подскажите лучший вариант реализации. Заранее спасибо.

Код какой-то не дописаный. Анализ переменной result точно происходит в цикле а не за его пределами?
Re: Прием данных сервлетом
От: Аноним  
Дата: 13.03.08 12:53
Оценка: 1 (1)
Здравствуйте, jokingless, Вы писали:

J>
J>conn = (HttpURLConnection) new URL(HOST_URL).openConnection();
J>conn.setRequestMethod("POST");
J>conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
J>conn.setDoOutput(true);
J>final OutputStream outputStream = conn.getOutputStream();
J>outputStream.write(CLIENT_IDENT_NUM.concat(command).getBytes());
J>outputStream.flush();
J>outputStream.close();
J>

Избыточное цитирование удалено.

Если я не ошибаюсь, то нужно ещё вызвать метод conn.getResponseCode(); чтобы послать запрос в сервлет.
Re[2]: Прием данных сервлетом
От: jokingless Украина  
Дата: 13.03.08 16:37
Оценка:
Здравствуйте, stenkil, Вы писали:

S>Здравствуйте, jokingless, Вы писали:


J>>На сервлете чтение данных:

J>>
J>>ServletInputStream is = request.getInputStream();
J>>BufferedReader reader = new BufferedReader(
J>>new InputStreamReader(is));
J>>String result = null;
J>>while( (result = reader.readLine()) != null) {
J>>}
J>>


S>А до вызова request.getInputStream() чтение параметров из request не делал ?


нет, к request до чтения потока вообще не прикасался...
Утратив все мы обретем свободу (с) Тайлер Дерден
Re[2]: Прием данных сервлетом
От: jokingless Украина  
Дата: 13.03.08 16:41
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, jokingless, Вы писали:


J>>Суть ошибки: данные не считываются (строка result — пустая и тип исключения String:nulljava.lang.NullPointerException ), при этом обращение к сервлету осуществляется т.к. метод doPost выполняется. Помогите, пожалуйста, поправить код, либо подскажите лучший вариант реализации. Заранее спасибо.

B>Код какой-то не дописаный. Анализ переменной result точно происходит в цикле а не за его пределами?

В принципе мне пока что не важно полнота данных, а важното, что данные теряются где-то и строка result остается пустой даже после чтения в нее потока. Т.е. не важно место реализации result, а то, что при любой реализации эта строка остается пуста.
Утратив все мы обретем свободу (с) Тайлер Дерден
Re[2]: Прием данных сервлетом
От: jokingless Украина  
Дата: 13.03.08 16:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, jokingless, Вы писали:


J>>
J>>conn = (HttpURLConnection) new URL(HOST_URL).openConnection();
J>>conn.setRequestMethod("POST");
J>>conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
J>>conn.setDoOutput(true);
J>>final OutputStream outputStream = conn.getOutputStream();
J>>outputStream.write(CLIENT_IDENT_NUM.concat(command).getBytes());
J>>outputStream.flush();
J>>outputStream.close();
J>>



А>Если я не ошибаюсь, то нужно ещё вызвать метод conn.getResponseCode(); чтобы послать запрос в сервлет.


Почему-то мне кажеться, что этот метод лишь возвращает инт число, которое и есть ответом сервера на запрос, в связи с этим мне непонятно как он может что-то попрравить в коде.
Утратив все мы обретем свободу (с) Тайлер Дерден
Re[2]: Прием данных сервлетом
От: mselez  
Дата: 13.03.08 21:18
Оценка:
Здравствуйте, Аноним, Вы писали:



А>Если я не ошибаюсь, то нужно ещё вызвать метод conn.getResponseCode(); чтобы послать запрос в сервлет.


Верно. В post пока на клиенте на перейдете к чтению ответа, т.е. не откроете inputstream или не сделаете conn.getResponseCode(), ничего на сервер передаваться не будет. На сервер данные из буфера клиента будут отосланы именно при указанных действиях, которые означают , что запись данных окончена. Это типа защита такая, потому что согласно http в хедере запроса надо указать размер данных. Если приступили к чтению, значит ничего писать больше не будете (и не получится).
Re[3]: Прием данных сервлетом
От: Cyberax Марс  
Дата: 13.03.08 21:26
Оценка: +1
Здравствуйте, mselez, Вы писали:

M>Верно. В post пока на клиенте на перейдете к чтению ответа, т.е. не откроете inputstream или не сделаете conn.getResponseCode(), ничего на сервер передаваться не будет. На сервер данные из буфера клиента будут отосланы именно при указанных действиях, которые означают , что запись данных окончена. Это типа защита такая, потому что согласно http в хедере запроса надо указать размер данных. Если приступили к чтению, значит ничего писать больше не будете (и не получится).

Не совсем. Поле content-length — опционально. Никто не мешает отсылать непрерывный поток url-encoded данных.

Более того, такой подход может быть использован для непрерывного обновления данных на сервере.
Sapienti sat!
Re[4]: Прием данных сервлетом
От: mselez  
Дата: 14.03.08 12:07
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, mselez, Вы писали:


M>>Верно. В post пока на клиенте на перейдете к чтению ответа, т.е. не откроете inputstream или не сделаете conn.getResponseCode(), ничего на сервер передаваться не будет. На сервер данные из буфера клиента будут отосланы именно при указанных действиях, которые означают , что запись данных окончена. Это типа защита такая, потому что согласно http в хедере запроса надо указать размер данных. Если приступили к чтению, значит ничего писать больше не будете (и не получится).

C>Не совсем. Поле content-length — опционально. Никто не мешает отсылать непрерывный поток url-encoded данных.

C>Более того, такой подход может быть использован для непрерывного обновления данных на сервере.


Вот цитата из здесь

For compatibility with HTTP/1.0 applications, HTTP/1.1 requests containing a message-body MUST include a valid Content-Length header field unless the server is known to be HTTP/1.1 compliant.


URLConnection удовлетворяет требованию совместимости с HTTP/1.0.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.