Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервелет: не могу нормально входящий поток считать :( / 6 сообщений из 6, страница 1 из 1
17.05.2012, 08:58:31
    #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
17.05.2012, 09:49:44
    #37798237
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервелет: не могу нормально входящий поток считать :(
Что за дурацкая привычка через readLine() данные вычитывать. Работа со строками нужна в очень редких случаях. И этот метод нужно использовать только при работе с данными, где вам нужно оперировать отдельными строками. Читайте посивольно с буфером.
...
Рейтинг: 0 / 0
17.05.2012, 10:13:18
    #37798282
vood_nsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервелет: не могу нормально входящий поток считать :(
BlazkowiczЧто за дурацкая привычка через readLine() данные вычитывать. Работа со строками нужна в очень редких случаях. И этот метод нужно использовать только при работе с данными, где вам нужно оперировать отдельными строками. Читайте посивольно с буфером.
Что за дурацкая привычка высказываться не по теме?
Читайте внимательнее. Я указал, что изначально все было идентично апплету - там чтение посимвольное. В любом случае, построчное чтение ничего не ухудшает, а посимвольное, в данном конкретном случае, решению проблемы никак не помогает.
...
Рейтинг: 0 / 0
17.05.2012, 10:22:48
    #37798307
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервелет: не могу нормально входящий поток считать :(
vood_nskЧто за дурацкая привычка высказываться не по теме?

Стараюсь.

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

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

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

ОК

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

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

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


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