Форум: "Сети";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
ВнизSckets: почему так получается Найти похожие ветки
← →
Галинка (2008-06-30 17:35) [0]пробую оседлать сокеты. Вроде в основном работает. Но есть одна проблемка, которая пока решается с помощью sleep(). А именно:
сервер не получает от клиента всю информацию. В осоьбенности когда серверу требуется долгое обращение к базе данныхю Например: кассируем товар <EAN>ett - вводим баркод, нажимаем Total и последния Total для продажи. Но, после введения баркода, сервер обращается к БД, и теряет концовку переданной ему строки. Как это победить?
ПыСы: причина вероятно лежит в том, что сервер раз в пять медленнее клиента (в смусле железо медленнее).
← →
clickmaker © (2008-06-30 17:40) [1]что значит "теряет"? Она вообще не доходит полностью?
← →
Галинка (2008-06-30 17:43) [2]я не могу точно сказать. Но эти буквы - это эмуляция нажатия кнопок на клавиатуре кассы. То что я вижу: ввод баркода осуществляется, потом нажимается ввод, дальше касса обращается к БД для поиска товара по коду, происходит кассирование товара, а тотал уже не доходит. Т.е. чек я закрыть не могу.
← →
Галинка (2008-06-30 17:48) [3]то же самое происходит и при регистрации кассира, например. Т.е. вводится номер кассира, номер денежного ящика (это то, куда купюры складываются) и ПИН: например, 2020е2020е2020ее. Дальше идет обращение к БД, для поиска данных кассира. После того как кассир определен появляется сообщение "Касса зарегистрирована - нажмите ВВОД" (для этого сообщения собственно и стоит выделенная жирным е). Но эта часть строки игнорируется.
Операции же, которые не требуют обращения к базе (например, шторнирование чека или позици) проходят на "ура".
← →
clickmaker © (2008-06-30 17:50) [4]ну а какие варианты?
1. "Усилить" железо на серваке
2. Оптимизировать доступ к БД
3. Организовать очередь, чтобы данные не терялись
← →
Галинка (2008-06-30 17:58) [5]clickmaker © (30.06.08 17:50) [4]
мне наверное подходит только третий вариант. Потому что все остальное никак от меня не зависит. Только как это сделать?
В коде на с++ это выглядело примерно такint CRSendKey(int iSocket, char *szKey)
{
int i=0;
for (i=0;i<strlen(szKey);i++)
{
if (*(szKey+i) != """) {
send(iSocket,szKey+i,1,0);
wait(iSocket);
}
}
return 0;
}
но как выделенное дирным реализовать на яве, я никак не могу найти ((
← →
Галинка (2008-06-30 19:39) [6]нашла как реализовать wait. Просто серверу надо послать сообщение "wait". Но для меня проблема в том, что я могу посылать сообщения только побуквенно. Т.е. в процедуре:
private void sendRequest(String _request) throws InterruptedException
{
try{
output.flush();
for (int i=0; i<_request.length(); i++)
{
output.write(_request.charAt(i));
sendWait();
}
}
catch (IOException er)
{
System.err.println(er.toString());
System.exit(-1);
}
}
надо выполнить процедуру:private void sendWait() throws InterruptedException
{
String waitReq = "*wait\n";
try{
for (int i=0; i<waitReq.length(); i++)
{
output.write(waitReq.charAt(i));
}
}
catch (IOException er)
{
System.err.println(er.toString());
System.exit(-1);
}
}
и вероятно буфер затирается.
← →
Галинка (2008-06-30 19:48) [7]кажется глупость написала (((
← →
Сергей М. © (2008-06-30 20:22) [8]Глупость началась началась раньше, вот с этого:
> причина вероятно лежит в том, что сервер раз в пять медленнее
> клиента (в смусле железо медленнее)
Грамотно реализованный транспортный алгоритм приемника не может терять ни байта передаваемых ей передатчиком по протоколу TCP данных.
Если это так, то проблема - в передатчике.
Поиски источника проблемы следует начинать с выяснения режима работы сокета-передатчика - блокирующий или неблокирующий.
← →
Sha © (2008-07-01 09:37) [9]> Галинка
Думаю, через форум научиться работать с сокетами с нуля сложновато будет.
← →
ЮЮ © (2008-07-01 11:43) [10]> Думаю, через форум научиться работать с сокетами с нуля
> сложновато будет.
Надеюсь, Галинка поняла, что это приглащение поговорить о сокетах в более тесном общении :)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c