Все работает. Сервлет принимает данные из входящего(request) потока байт, тоже в цикле.
Прием данных сервлетом (выход из цикла) заканчивается сразу после вызова pFile->EndRequest(). После получения данных, сервлет может обращаться в базу, выполнять какие-то операцие, в результате чего получает данные, которые нужно вернуть обратно клиенту. Пусть это будет число или строка. response.setHeader("param_name",param_value); не работает, так как уже был сделан pFile->EndRequest().
Повторный
bRes = pFile->SendRequest();
снова вызовет сервлет, но это уже будет новый вызов, а не продолжение старого. Можно, конечно, сделать типа switch и передавать сервлету какойто код, в зависимости от которого он выполняет те или иные операции. Но тогда придется разделять функции субд на несколько, что не есть хорошо.
Как организуют двусторонний диалог между сервером и клиентом с помощью сервлетов?
Вообще-то ты должен сразу же после Write делать Read, не закрывая соединения. Сервлет должен определить, что клиент закончил посылку данных и начать передавать данные обратно.
Здравствуйте, Mishka, Вы писали:
M>Вообще-то ты должен сразу же после Write делать Read, не закрывая соединения. Сервлет должен определить, что клиент закончил посылку данных и начать передавать данные обратно.
Здравствуйте, Mishka, Вы писали:
M>Вообще-то ты должен сразу же после Write делать Read, не закрывая соединения. Сервлет должен определить, что клиент закончил посылку данных и начать передавать данные обратно.
Я делаю так:
pFile=conn->OpenRequest(CHttpConnection::HTTP_VERB_POST,szHTTPPath);
pFile->SendRequestEx(dwSize);
pFile->Write(lpBuff,dwSize);
dwRead = pFile->Read(lpBuff,dwCopyBufSize);
...
На последней строчке вылетает exception "Дескриптор имеет неправильное состояние для запрошенного действия".
В сервлете код тоже довольно прост.
OutputStream l_OutputStream =null;
InputStream l_InputStream = null;
l_InputStream = request.getInputStream();
try
{
byte[] buffer = new byte[1048576];
int len = 1048576;
int nread;
while ((nread= l_InputStream.read(buffer,0,len)) != -1)
{
if (nread==0) break;
System.out.println(buffer);
}
l_InputStream.close();
l_OutputStream = response.getOutputStream();
String s1 = "test string from server";
buffer = s1.getBytes();
nread = buffer.length;
l_OutputStream.write(buffer,0,nread);
}
Дело видимо в том, что запрос был методом POST на конкретное количество байт...
Здравствуйте, Cider, Вы писали:
C>Вот где собака порылась: A_>>l_InputStream.close(); C>Ты в сервлете закрываешь соединение — не надо этого делать.
Нет, не в этом дело. Что-то в принципе неправильно. Пробовала вызывать
pFile->Write(lpBuff,dwSize);
pFile->Flush();
но не помогает. Вылетает тот же exception при попытке читать из потока:
dwRead = pFile->Read(lpBuff,m_dwCopyBufSize);
Здравствуйте, Cider, Вы писали:
C>Вот где собака порылась: A_>>l_InputStream.close(); C>Ты в сервлете закрываешь соединение — не надо этого делать.
Можешь ставить сколько угодно минусов, но закрытие InputStream в сервлете закрывает все соединиение. И когда после этого клиент пытается что-либо прочитать — вылетает ошибка.
Здравствуйте, Cider, Вы писали:
C>Здравствуйте, Cider, Вы писали:
C>>Вот где собака порылась: A_>>>l_InputStream.close(); C>>Ты в сервлете закрываешь соединение — не надо этого делать.
C>Можешь ставить сколько угодно минусов, но закрытие InputStream в сервлете закрывает все соединиение. И когда после этого клиент пытается что-либо прочитать — вылетает ошибка.
C>Cider
Здравствуйте, Mishka, Вы писали:
M>Да, и кстати, проблема скорее всего не в Java. Попробуй в качестве сайта указать www.microsoft.com. Клиент должен и так работать.
Не работает. Мне кажется, не в этом дело. Как только в сервлет передается указанное в запросе количество байт, он быстро выполняет остальные дейстия (пишет в поток, не дожидаясь, когда клиент прочитает) и заканчивает работу (без ошибок). А по идее должен ждать, пока клиент начнет читать...
Здравствуйте, Ann_vv, Вы писали:
A_>Здравствуйте, Mishka, Вы писали:
M>>Да, и кстати, проблема скорее всего не в Java. Попробуй в качестве сайта указать www.microsoft.com. Клиент должен и так работать.
A_>Не работает. Мне кажется, не в этом дело. Как только в сервлет передается указанное в запросе количество байт, он быстро выполняет остальные дейстия (пишет в поток, не дожидаясь, когда клиент прочитает) и заканчивает работу (без ошибок). А по идее должен ждать, пока клиент начнет читать...
Так это нормальное поведение любого HTTP сервера — прочитать запрос, обработать и послать ответ. А если клиент вдруг умер, то сервер это событие обычно мало волнует. И как сервер может узнать, что клиент начал читать ? Клиент после того как послал запрос должен начать читать ответ.