С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23

Отправить данные с Applet к Servlet

20.02.2008, 12:29. Показов 3339. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть апплет, из которого нужно отсылать запросы на сервлет. Запросы должны идти друг за другом НЕ дожидаясь ответа от сервлета.
Пробовал написать так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
URL url = new URL(address);
java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();
conn.setRequestMethod('POST');
conn.setRequestProperty('Content-Type', 'application/octet-stream');
        
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
 
OutputStream out0 = conn.getOutputStream();
ObjectOutputStream out = new ObjectOutputStream(out0);
 
String rres = '';   
for(int i=0; i<5; i++)
{
    Object req = 'Request ' + i; 
    out.writeObject(req);
    out.flush();
    System.out.println('
Written: ' + req);      
}
//Отправка данных происходит только здесь. Отправляются сразу 5 объектов, а нужно, чтобы они отправлялись друг за другом.
При этом ответ от сервлета должен приходить только после последнего объекта. Делать вектор объектов - не подходит по условию задачи.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    
InputStream in0 = conn.getInputStream(); //connect
ObjectInputStream in = new ObjectInputStream(in0);
System.out.println('
Connected');
        
for(int i=0; i<5; i++)
{
    rres = (String) in.readObject();
    System.out.println('
'+rres);
}   
            
out.close();
in.close();
Можно ли добиться требуемого результата? Может надо пользоваться другими запросами?

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2008, 12:29
Ответы с готовыми решениями:

applet<->servlet<->oracle
Есть аплет, который работает с базой данных Oracle через сервлет. Есть ли какие-нибудь стандарты для работы с такой цепочкой? Я на данный...

Обращение к Servlet из Applet-a
Подскажите, пожалуйста, как напрямую из Applet-a вызвать Servlet (не создавая в Applet-e HTML-странички)

Как связать Applet и Servlet ?
Здравствуйте я в Java новенький. Стоит задача связать Applet c гридами, меню и пр. с Servlet'ом Использую Oracle9i, JDeveloper 3.2.3, ...

19
mishgun
20.02.2008, 23:34
Ну во первых у тебя ошибка в строке
Java
1
conn.setRequestProperty('Content-Type', 'application/octet-stream');
выглядить она должна так
Java
1
conn.setRequestProperty('CONTENT_TYPE','application/octet-stream');
И попробуй закрывать коннект
Java
1
2
3
4
5
6
7
8
9
for(int i=0; i<5; i++)
{
Object req = 'Request ' + i;
out.writeObject(req);
out.flush();
out.close();
System.out.println('
Written: ' + req);
}
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23
24.02.2008, 10:37  [ТС]
Mishgun, спасибо за ответ.
Пробовал закрывать ObjectOutputStream: out.close - не помогает.
Исправил 'CONTENT_TYPE' - тоже никак не повлияло.
Все равно отсылка всех объектов (сразу) происходит только при
conn.getInputStream().
Хотел сделать так:
Отослал объект - получил ответ от сервлета;
Отослал объект - получил ответ от сервлета;
Не работает - ошибка на стороне сервлета:
при rres = (String) in.readObject()
выдает EOFException - expecting data.
хотя данные со стороны апплета отсылаются.

Можно ли все-таки отправлять объекты друг за другом?
0
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23
24.02.2008, 11:29  [ТС]
P.S.
Если заново открывать соединение
Java
1
2
3
4
5
OutputStream out2 = conn.getOutputStream();
ObjectOutputStream out22 = new ObjectOutputStream(out2);
out22.writeObject(req2);
out22.flush();
out22.close()
то выдается такой Exception:
java.net.ProtocolException: Cannot write output after reading input.
0
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23
24.02.2008, 12:55  [ТС]
А может тогда использовать не HTTP?
0
mishgun
24.02.2008, 17:36
Прийдется похоже тебе сделать это через Thread там есть методы которые
позволяют притормозить какие то действия пока совершаются другие.Ты с Тредами(Нитями)знаком?
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23
24.02.2008, 18:38  [ТС]
В общих чертах с Thread'ами я знаком. Ты наверное имеешь в виду метод join().
Но мне на самом деле надо отсылать объекты в рамках одного соединения, т.е. не делать несколько url.openConnection() и таким образом несколько раз запускать сервлет.
А насколько я понимаю с помощью Thread'ов придется создавать несколько потоков, у каждого из которых будет свой url.openConnection(). Затем делать им thread.join(), чтобы они ждали завершения предыдущего потока.
Правильно ли я понял?
Или ты имеешь в виду действия внутри одного Thread'а и там методы типа wait() и т.п.?
0
mishgun
24.02.2008, 20:48
Как раз последнее wait() notify notifyAll()
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23
25.02.2008, 10:08  [ТС]
А как это мне поможет избежать Exception
java.net.ProtocolException: Cannot write output after reading input ?
Можешь поподробнее написать?
0
mishgun
25.02.2008, 17:33
Моя мысль была поставить все запросы к сервлету в очередь используя метод wait().То есть пока отправляется первый запрос остальные ждут.
И судя по Exception у тебя сервлет сразу по получения запроса пишет ответ(если я правильно понял из кусков кода).Я думаю что отправку ответа надо задержать до получения всех запросов.
Хотя при рассмотрении кода я не вижу что бы сервлет отправлял ответ.Значит ситуевина такая необходимо задержать прием запросов в сервлете чтобы InputStream работал когда пройдут все запросы в твоем случае он начинает работать после первого запроса
Или по другому посылаешь запрос из апплета в сервлет сервлет его плучает отправляет ответ апплету тогда отправляем второй ответ .В Этом случае InputStream уже сработал и ждет второй запрос.Тогда не надо в сервлете расписывать треды а только отправлять флаг апплету чтто типа запрос получен - давай следующий
1 / 1 / 1
Регистрация: 18.08.2007
Сообщений: 289
25.02.2008, 18:53
Попробуйте вот это.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//-----Код клиента-----//
 
public void sendObject(OutputStream out, Object o) {
  ObjectOutputStream outObj = new ObjectOutputStream(out);
  outObj.writeObject(o);
  outObj.flush();
  outObj.close();
  System.out.println('
Written: ' + req); 
  }
}
 
... {
  for(int i=0; i<5; i++) {
    Object req = new String('Request ' + i); 
    OutputStream output = conn.getOutputStream();
    sendObject(output, req);
  }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//-----Код сервера-----//
 
public void receiveObject(InputStream in, Object o) {
  ObjectInputStream inObj = new ObjectInputStream(in);
  o = inObj.readObject();
  inObj.close();//Интересно, после этого сможет ли conn в вызывающем коде дать нам 'новый' открытый InputStream? Если нет -- возможно исключение.
  System.out.println('
Read: ' + (String)o); 
  }
}
 
... {
  Object rres;
  InputStream input;
  for(int i=0; i<5; i++) {
    input = conn.getInputStream();//Плучаем 'новый' поток данных
    receiveObject(input, rres);
    String result = (String)rres;
    System.out.println('
'+result);
    ...//Используем result
  }
}
Да, ещё надо учесть особенности работы HttpURLConnection: может ли оно держаться и выдавать новые открытые потоки данных (conn.getInputStream(); conn.getOutputStream()) при закрытии 'старых' соответствующих объектных потоков, построенных на основе InputStream и OutputStream. Предупреждаю, я не проверял.

Советую передавать объекты либо в общем контейнере(Vector), либо по-одиночке, каждый раз создавая новый поток, открывая, записывая/читая в/из него и закрывая его. На сервлете можно использовать HTTPSession, чтобы удержать клиента на время его работы с сервером.
0
mishgun
25.02.2008, 23:15
Это было бы самое простое только вот автору по условия нельзя использовать контейнеры.
И всё таки я думаю что вариант с тредами и отправкой сервлетом сигнала апплету о получении запроса и типа давай следующий лютше.
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23
26.02.2008, 11:21  [ТС]
Вот чего я пишу

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
// ---- applet ---- //
...
URL url = new URL(address);
java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();
conn.setRequestMethod('POST');
conn.setRequestProperty('CONTENT_TYPE', 'application/octet-stream');
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
 
OutputStream out0;
ObjectOutputStream out;
        
InputStream in0;
ObjectInputStream in;
 
String rres = '';
 
for(int i=0; i<5; i++)
{
System.out.println('Start '+i); 
System.out.print('Getting output stream ...');  
out0 = conn.getOutputStream();
System.out.println('done'); 
out = new ObjectOutputStream(out0);
Object req = 'Request ' + i; 
out.writeObject(req);
out.flush();
out.close();
System.out.println('
Written: ' + req);
in0 = conn.getInputStream(); //connect
in = new ObjectInputStream(in0);
rres = (String) in.readObject();
System.out.println('
'+rres);
}
...
Первая итерация проходит успешно.
Во второй итерации при попытке
conn.getOutputStream()
выдается такой exception
java.net.ProtocolException: Cannot write output after reading input

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ---- servlet ---- //
...
ObjectInputStream in;
ObjectOutputStream out;
 
for(int i=0; i<5; i++)
{
System.out.println('Start '+i);
in = new ObjectInputStream(request.getInputStream());
out = new ObjectOutputStream(response.getOutputStream());
System.out.println('>>> ' + getClass().getName() + ' read: ' + in.readObject());
 
out.writeObject('>>> RESPONSE <<< ');
out.flush();
out.close();
}
Аналогично первая итерация проходит успешно.
Во второй итерации при попытке
request.getgetInputStream()
выдается exception
java.io.StreamCorruptedException: Caught EOFException while reading the stream header.
Это исключение, как я понимаю, является следствием ошибки на стороне апплета.

Т.о. запрос1 отсылается, принимается сервлетом, сервлет отсылает ответ1, апплет получает ответ1
А вот дальше запрос2 не отсылается ...
0
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23
26.02.2008, 11:52  [ТС]
2 mishgun
Что касается задержек запросов - то пока я так и не понял смысл чего эта задержка и выстраивание в очередь запросов даст.
'Я думаю что отправку ответа надо задержать до получения всех запросов.'
- а вот как собственно отправить по ОДНОМУ (не вектор запросов) запросы на сервер? Мне надо получить запрос - 'посмотреть' на него, затем получить следующий - 'посмотреть' на него и т.д.

'Или по другому посылаешь запрос из апплета в сервлет сервлет его плучает отправляет ответ апплету тогда отправляем второй ответ '

- именно так я и хочу сделать - только вот не получается

2 iZEN:
Я вроде примерно так и написал - только внутри цикла for

'либо по-одиночке, каждый раз создавая новый поток, открывая, записывая/читая в/из него и закрывая его. На сервлете можно использовать HTTPSession, чтобы удержать клиента на время его работы с сервером'

- А можно про удержание клиента поподробнее - мне нужно пересылать объекты не разрывая соединение.

P.S.
Спасибо всем за советы!
0
mishgun
26.02.2008, 19:15
попробуй так
апплет
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//метод пишущий запрос
public void writeRequset(URLConnection conn,Object value){
      try{  
        conn.setUseCaches(false);
        conn.setRequestProperty('CONTENT_TYPE','application/octet-stream');
        conn.setDoInput(true);
        conn.setDoOutput(true);
        ObjectOutputStream os =
                new ObjectOutputStream(conn.getOutputStream());
        System.err.println('Writing Order');
        os.writeObject(value);
        os.flush();
        os.close();
      }
      catch(IOException e){
         System.err.println('Error1' + e.toString());
      }
    
    }
    
//метод получающий ответ
public boolean readResponse(URLConnection conn){
      Object o;
          boolean flag ;
                
       try{ 
        
        ObjectInputStream is = 
                 new ObjectInputStream(conn.getInputStream());
        System.err.println('Waiting for response');
        o = is.readObject();
        is.close();
       }
       catch(IOException e){
          System.err.println('Error2' + e);
       }
       if(o!=null)
             flag = true;
           else{
             flag = false;
           } 
            
      return flag;  
    }
//метод посылающий запросы и принимающий ответы
public void sentRequest(){  
   try{
            
 
    URL url = new URL('http://localhost:8100/servlet/YourServlet');
     System.err.println('Opening connection');
            
    URLConnection conn = url.openConnection();
       
      for(int i = 0 ; i < 5 ; i++){
       String req = 'request' + i;
    
    writeRequest(conn,req);
    boolean response = readResponse(conn);
        
       if(!response){
         System.err.println('readObject failed');
       break;
       } 
      }
  }
  catch(MalformedURLException mue){
    System.err.println('Error1' + mue.getMessage());
  }
 catch(Exception ex){
  System.err.println('Error2' + ex.getMessage());
 }
         
}
// сервлет
public void service(
        HttpServletRequest request,HttpServletResponse response)
        throws ServletException,IOException{
        
            ObjectInputStream ois = 
                new ObjectInputStream(request.getInputStream());
                        
                        
            response.setContentType('application/octet-stream');
            
            ObjectOutputStream oos =
                new ObjectOutputStream(response.getOutputStream());
            oos.writeObject(' Response ');
            oos.flush();
            oos.close();
}
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23
27.02.2008, 17:41  [ТС]
2 mishgun
Пробовал использовать твой код. После
Opening connection
Writing Order
Waiting for response
выдается исключение
java.lang.IllegalAccessError: Already connected

Мне на другом форуме сказали, что так делать все равно нельзя:
'Serlvet I/O Stream is not the same as normal TCP I/O stream. You can only open OutputStream to write to servlet before u open the InputStream. Once u open the InputStream, u can no longer open OutputStream with the same URLConnection. If u want to send more data, u've to open URLConnection again.'
А вот как сделать используя тот же URLConnection - неизвестно.Может у тебя есть какие-ниб. идеи по поводу 'normal TCP I/O stream'.
Как использовать ТСР соединения? Или где можно про это прочитать?
0
mishgun
27.02.2008, 18:43
TCP/IP-это тебе надо создавать сокетное соединение.В этом случае могут быть проблемы с апплетом потому что будут выпадать исключения безопасности.Знаешь что вместо того чтобы името общее соединение в методе sendrequest сделай URLConnection отдельно в каждом методе а из sendRequest убери тогда должно работать.Хотя я бы вашему преподу сказал пару ласковых насчет таких заданий.В нормальной практике никогда тебе не придется заниматься таким онанизмом.Засунул все в вектор(а ещё лучше хаштейбл) передал его сервлету и всем хорошо.А здесь во-первых и ресурсов больше уходить будет(каждый раз создавать соединение)и логики в такой проге вообще не будет.
1 / 1 / 1
Регистрация: 18.08.2007
Сообщений: 289
27.02.2008, 23:08
Автору темы.
Посоветую заглянуть во в эти книжки, по-моему, там что-то такое есть и даже больше:
1. 'Разработка Web-серверов для электронной коммерции. Комплексный подход (с CD-ROM)' Шарма, Шарма (http://www.books.ru/shop/books/9016);
2. 'Сервлеты и JavaServer Pages. Библиотека программиста' Холл (http://www.books.ru/shop/books/11656).
Особенно последняя самая насыщенная и подробная. Советую посмотреть обе.

Удачи!
0
0 / 0 / 0
Регистрация: 20.02.2008
Сообщений: 23
04.03.2008, 09:27  [ТС]
Спасибо всем за советы.
Мне тут предложили сделать все через RMI. Если получится - напишу.
0
75 / 36 / 1
Регистрация: 03.08.2012
Сообщений: 447
26.12.2014, 19:55
konn, видимо ничего не вышло? Или вы уже превратились в песок?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.12.2014, 19:55
Помогаю со студенческими работами здесь

MS sql, servlet & applet
Здравствуйте, я новичок, передо мной стоит задача, суть такова: Сервер на котором MS sql server 2005 с нужной бд (перенос нежелателен). ...

Взаимодействие между applet<->servlet->db, создание java online игры
хочу создать java online игру и как я понял надо это сделать так applet-&gt;servlet-&gt;bd. я в яве новичок. вот не знаю как реализовать это. на...

Intellij idea не может скачать зависимость javax.servlet.servlet:servlet-api:3.0.1
intellij idea не может скачать зависимость javax.servlet.servlet:servlet-api:3.0.1 Идет загрузка, потом пропадает, но зависимость...

Как отправить ответ сервера клиенту? Servlet Tomcat
Посылаю запрос серверу, передаю строку String url = &quot;http://192.168.0.5:8888&quot;; DefaultHttpClient hc = new...

Servlet. Получить данные из combobox
Добрый вечер. У меня есть код: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru