powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервелет: не могу нормально входящий поток считать :(
6 сообщений из 6, страница 1 из 1
Сервелет: не могу нормально входящий поток считать :(
    #37798170
vood_nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Используется в конторе с незапамятных времен сервлет для шлюзования запросов из лвс наружу. Технология хоть и старье, но работает, все к ней привыкли, менять технологию не будем.
Раньше от клиента шел просто запрос, теперь надо xml'ку кидать. Сам я на жабе не кодил толком никогда, но разбираться мне.
На этапе отладки технологии сделал апплет, который кидает xml сервлету и получает аналогичный ответ. Сервлет, для контроля, пишет запрос в файл, а апплет - ответ.
Вроде все просто, но сервелет при чтении потока зависает в конце, т.е. данные все вычитал, но проверка на конец данных не срабатывает.

Сервлет:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
  {  
	InputStreamReader isr = new InputStreamReader(request.getInputStream());
	BufferedReader buff = new BufferedReader(isr);
    StringBuffer strBuff = new StringBuffer();
	String s;
    while (( s = buff.readLine()) != null ) 
	{
		strBuff.append(s);
    }

    String strRequest = strBuff.toString();
    FileOutputStream fos = new FileOutputStream("c:\\temp\\cl_request.xml");
    fos.write(strRequest.getBytes("UTF-8"));
    fos.flush();
	fos.close();

    // отправка ответа
    byte[] arResponse = makeResponse();

   
    OutputStream outputStream = response.getOutputStream();
    outputStream.write(arResponse);
    outputStream.flush();
    outputStream.close();
  }



Апплет:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
  public static void main(String[] args)
    throws Exception
  {
      URL server = new URL("http://127.0.0.1:8080/apps/servlet/TestServer");
      HttpURLConnection conn = (HttpURLConnection)server.openConnection();
    byte[] request = makeRequest();

    conn.setDoOutput(true);        
    //conn.setRequestProperty("Host", "127.0.0.1");        
    //conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");        
    //conn.connect();
	
    OutputStream outputStream = conn.getOutputStream();
    outputStream.write(request);
    outputStream.flush();
    outputStream.close();
	
    // ответ сервлета
    String strResponse = readResponse(conn.getInputStream());
	
    FileOutputStream fos = new FileOutputStream("c:\\temp\\srv_response.xml");
    fos.write(strResponse.getBytes("UTF-8"));
    fos.flush();
    fos.close();
  }

  private static byte[] makeRequest() throws IOException 
  {
    FileInputStream input = new FileInputStream("c:\\temp\\cl_send.xml");
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    byte[] buffer = new byte[4096];
    int n;
    while (-1 != (n = input.read(buffer)))
    {
      output.write(buffer, 0, n);
    }
	input.close();
    output.write("\r\n".getBytes());
    
    return output.toByteArray();
  }

  private static String readResponse(InputStream input) throws IOException {
    StringBuffer result = new StringBuffer();
    while (true) {
      String s = readResponseLine(input, "UTF-8");
      if (s == null) break;
      result.append(s);
    }
    return result.toString();
  }

  private static String readResponseLine(InputStream is, String enc) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int i;
    while ((i = is.read()) != -1)
    {
      if (i == 10) break;
      if (i != 13)
        baos.write(i);
    }
    baos.flush();
    baos.close();
    byte[] buf = baos.toByteArray();
    if ((buf.length == 0) && (i == -1)) {
      return null;
    }
    return new String(buf, enc);
  }



Причем, если клиенту вернуть ответе - все читается и сохраняется. Функция makeResponse сервлета аналогична функции makeRequest апплета. И, изначально, функции чтения потока так же были один в один - сервлет вис. Потом уже я всякие варианты пробовал - без эффекта. На клиенте закомментарены строки настройки соединения - пробовал всякое и не только эти - ничего не меняется.

Вроде самые основы, ничего особенного, но на грабли напоролся.
Что делаю не так?
...
Рейтинг: 0 / 0
Сервелет: не могу нормально входящий поток считать :(
    #37798237
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за дурацкая привычка через readLine() данные вычитывать. Работа со строками нужна в очень редких случаях. И этот метод нужно использовать только при работе с данными, где вам нужно оперировать отдельными строками. Читайте посивольно с буфером.
...
Рейтинг: 0 / 0
Сервелет: не могу нормально входящий поток считать :(
    #37798282
vood_nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczЧто за дурацкая привычка через readLine() данные вычитывать. Работа со строками нужна в очень редких случаях. И этот метод нужно использовать только при работе с данными, где вам нужно оперировать отдельными строками. Читайте посивольно с буфером.
Что за дурацкая привычка высказываться не по теме?
Читайте внимательнее. Я указал, что изначально все было идентично апплету - там чтение посимвольное. В любом случае, построчное чтение ничего не ухудшает, а посимвольное, в данном конкретном случае, решению проблемы никак не помогает.
...
Рейтинг: 0 / 0
Сервелет: не могу нормально входящий поток считать :(
    #37798307
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vood_nskЧто за дурацкая привычка высказываться не по теме?

Стараюсь.

vood_nskЧитайте внимательнее.

Походу это мне нужна помощь?

vood_nskЯ указал, что изначально все было идентично апплету - там чтение посимвольное.

ОК

vood_nskВ любом случае, построчное чтение ничего не ухудшает, а посимвольное, в данном конкретном случае, решению проблемы никак не помогает.
Построчное больше памяти отъедает. XML он вообще многими тулзами в одну строку формируется.
-1 посылать не пробовали из апплета?
...
Рейтинг: 0 / 0
Сервелет: не могу нормально входящий поток считать :(
    #37798445
vood_nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz-1 посылать не пробовали из апплета?
Помогло!
Вот жеж хрень.
Добавил "outputStream.write(-1);".
Почему сработало - так и не понял, тем более, что ответ сервлета апплет читает безо всяких -1.

Спасибо!
...
Рейтинг: 0 / 0
Сервелет: не могу нормально входящий поток считать :(
    #37798461
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vood_nskПочему сработало - так и не понял, тем более, что ответ сервлета апплет читает безо всяких -1.

Это маркер конца чтения для InputStream
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервелет: не могу нормально входящий поток считать :(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]