Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ServerSocket & ClientSocket - передача списка из ListBox'a

1.9K
19 июня 2005 года
ProgMaster
47 / / 29.08.2004
Реазовываю нечто вроде чата. Дык вот. Вначале врубается сервер. Потом при заходе в клиент, вводим имя под которым будем чатиться. Это имя посылается серверу как запрос вида:
Цитата:
0000001:UserName


где 0000001 - код команды
Значит так, Вот серверная часть обработки строки:

Код:
void __fastcall TfServer::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  AnsiString ClientText;
  ClientText = Socket->ReceiveText();
  // lClientCmd - это Label на форме
  lClientCmd->Caption = ClientText;
  AnsiString Dots = ":";
  int iPos = 0;
  iPos = ClientText.Pos(Dots);
  if(iPos)
  {
    if(ClientText.SubString(1, iPos - 1) == "0000001")
    {
      // произошел разбор строки вида 0000001:UserName
      // теперь добавляем имя после двоеточия в ListBox
      lbUsers->Items->Add(ClientText.SubString(iPos+Dots.Length(), 255));
      for(int x = 0; x != ClientCount;) // ClientCount имеет тип int
      {
       // цилк чтобы послать всем клиентам
        for(int i = 0; i != lbUsers->Items->Count;)
        {
         // цикл для посылки имени из серверного ЛистБокса клиентовскому листБоксу. ЗДЕСЬ И ОШИБКА !!!
          ServerSocket->Socket->Connections[x]->SendText("0000001:"+lbUsers->Items->Strings);
          i++;
        }
        x++;
      }
    }
  }
}

Дык вот. Ошибка в том, что клиент походу не успевает обрабатывать запросы сервера...
Вот клиентская часть:
Код:
void __fastcall TfClient::ClientSocketRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  AnsiString ServerText;
  ServerText = Socket->ReceiveText();
  iPos = ServerText.Pos(Dots);
  if(iPos)
  {
    if(ServerText.SubString(1, iPos - 1) == "0000001")
    {
      lbUsers->Clear();
      lbUsers->Items->Add(ServerText.SubString(iPos+Dots.Length(), 255));
    }
  }
}

По сути дела сервер же посылает не весь ListBox за раз, а по одной строке, значит в клиенте должны имена добавляться построчно. А они добавляются все в ОДНУ СТРОКу, как если бы сервер послал весь листбокс за раз.
В чем тут может быть проблема ?
Как я и думал, он посылает всю в одну строчку, т.е. к примеру:
Цитата:
0000001:UserX0000001:UserN0000001:UserX0000001:UserN


Но по коду:

 
Код:
for(int x = 0; x != ClientCount;)
      {
        for(int i = 0; i != lbUsers->Items->Count;)
        {
          ServerSocket->Socket->Connections[x]->SendText("0000001:"+lbUsers->Items->Strings);
          i++;
        }
        x++;
      }

Ведь по одной строчке должен посылать, а не сразу всё X)-
10
19 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by ProgMaster
Ведь по одной строчке должен посылать, а не сразу всё X)-


Попробуй "\r\n" после каждой строчки посылать. :)

1.9K
19 июня 2005 года
ProgMaster
47 / / 29.08.2004
Цитата:
Originally posted by Freeman
Попробуй "\r\n" после каждой строчки посылать. :)


Да нет. И так пробывал. Во что получается:
BUG

1.9K
20 июня 2005 года
ProgMaster
47 / / 29.08.2004
Вообщем прочесал я весь код дебаггом. Такая фигня вышла, что сервер посылает запросы слишком быстро, а клиент не успевает их принимать, поэтому запросы накапливаются и превращаются в единую строку :(

Теперь поставлю вопрос так (уже не знаю как сделать): как передать от TServerSocket все данные из TListBox'a которые лежат на серваке клиентскому приложению, где стоит TClientSocket и чтобы они загрузились в ListBox клиента :???:
299
21 июня 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by ProgMaster
Вообщем прочесал я весь код дебаггом. Такая фигня вышла, что сервер посылает запросы слишком быстро, а клиент не успевает их принимать, поэтому запросы накапливаются и превращаются в единую строку :(

Теперь поставлю вопрос так (уже не знаю как сделать): как передать от TServerSocket все данные из TListBox'a которые лежат на серваке клиентскому приложению, где стоит TClientSocket и чтобы они загрузились в ListBox клиента :???:



Разве сложно после получения клиентом строки, регулярным выражением, или функцией какой(я уже просто не помню) разбить строку на мелкие строки поместив их в масив? А разделителем считать \r\n
После этого пихнуть построно каждый элемент масива в List...

10
21 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by 3D Bob
Разве сложно после получения клиентом строки, регулярным выражением, или функцией какой(я уже просто не помню) разбить строку на мелкие строки поместив их в масив? А разделителем считать \r\n
После этого пихнуть построно каждый элемент масива в List...


Кстати, посмотри, как сделано у Борланда в $(BCB)\Demos\Internet\Chat. Воспроизводится ли твоя ошибка на их примере?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог