Конференция "Сети" » Sckets: почему так получается
 
  • Галинка (30.06.08 17:35) [0]
    пробую оседлать сокеты. Вроде в основном работает. Но есть одна проблемка, которая пока решается с помощью sleep(). А именно:

    сервер не получает от клиента всю информацию. В осоьбенности когда серверу требуется долгое обращение к базе данныхю Например: кассируем товар <EAN>ett - вводим баркод, нажимаем Total и последния Total для продажи. Но, после введения баркода, сервер обращается к БД, и теряет концовку переданной ему строки. Как это победить?

    ПыСы: причина вероятно лежит в том, что сервер раз в пять медленнее клиента (в смусле железо медленнее).
  • clickmaker © (30.06.08 17:40) [1]
    что значит "теряет"? Она вообще не доходит полностью?
  • Галинка (30.06.08 17:43) [2]
    я не могу точно сказать. Но эти буквы - это эмуляция нажатия кнопок на клавиатуре кассы. То что я вижу: ввод баркода осуществляется, потом нажимается ввод, дальше касса обращается к БД для поиска товара по коду, происходит кассирование товара, а тотал уже не доходит. Т.е. чек я закрыть не могу.
  • Галинка (30.06.08 17:48) [3]
    то же самое происходит и при регистрации кассира, например. Т.е. вводится номер кассира, номер денежного ящика (это то, куда купюры складываются) и ПИН: например, 2020е2020е2020ее. Дальше идет обращение к БД, для поиска данных кассира. После того как кассир определен появляется сообщение "Касса зарегистрирована - нажмите ВВОД" (для этого сообщения собственно и стоит выделенная жирным е). Но эта часть строки игнорируется.

    Операции же, которые не требуют обращения к базе (например, шторнирование чека или позици) проходят на "ура".
  • clickmaker © (30.06.08 17:50) [4]
    ну а какие варианты?
    1. "Усилить" железо на серваке
    2. Оптимизировать доступ к БД
    3. Организовать очередь, чтобы данные не терялись
  • Галинка (30.06.08 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;
    }



    но как выделенное дирным реализовать на яве, я никак не могу найти ((
  • Галинка (30.06.08 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);
     }

    }



    и вероятно буфер затирается.
  • Галинка (30.06.08 19:48) [7]
    кажется глупость написала (((
  • Сергей М. © (30.06.08 20:22) [8]
    Глупость началась началась раньше, вот с этого:

    > причина вероятно лежит в том, что сервер раз в пять медленнее
    > клиента (в смусле железо медленнее)


    Грамотно реализованный транспортный алгоритм приемника не может терять ни байта передаваемых ей передатчиком по протоколу TCP данных.

    Если это так, то проблема - в передатчике.

    Поиски источника проблемы следует начинать с выяснения режима работы сокета-передатчика - блокирующий или неблокирующий.
  • Sha © (01.07.08 09:37) [9]
    > Галинка

    Думаю, через форум научиться работать с сокетами с нуля сложновато будет.
  • ЮЮ © (01.07.08 11:43) [10]
    > Думаю, через форум научиться работать с сокетами с нуля
    > сложновато будет.


    Надеюсь, Галинка поняла, что это приглащение поговорить о сокетах в более тесном общении :)
 
Конференция "Сети" » Sckets: почему так получается
Есть новые Нет новых   [134433   +21][b:0][p:0.001]