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++;
}
}
}
}
ServerSocket & ClientSocket - передача списка из ListBox'a
Цитата:
0000001:UserName
где 0000001 - код команды
Значит так, Вот серверная часть обработки строки:
Код:
Дык вот. Ошибка в том, что клиент походу не успевает обрабатывать запросы сервера...
Вот клиентская часть:
Код:
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));
}
}
}
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++;
}
{
for(int i = 0; i != lbUsers->Items->Count;)
{
ServerSocket->Socket->Connections[x]->SendText("0000001:"+lbUsers->Items->Strings);
i++;
}
x++;
}
Ведь по одной строчке должен посылать, а не сразу всё X)-
Цитата:
Originally posted by ProgMaster
Ведь по одной строчке должен посылать, а не сразу всё X)-
Ведь по одной строчке должен посылать, а не сразу всё X)-
Попробуй "\r\n" после каждой строчки посылать. :)
Цитата:
Originally posted by Freeman
Попробуй "\r\n" после каждой строчки посылать. :)
Попробуй "\r\n" после каждой строчки посылать. :)
Да нет. И так пробывал. Во что получается:
BUG
Теперь поставлю вопрос так (уже не знаю как сделать): как передать от TServerSocket все данные из TListBox'a которые лежат на серваке клиентскому приложению, где стоит TClientSocket и чтобы они загрузились в ListBox клиента :???:
Цитата:
Originally posted by ProgMaster
Вообщем прочесал я весь код дебаггом. Такая фигня вышла, что сервер посылает запросы слишком быстро, а клиент не успевает их принимать, поэтому запросы накапливаются и превращаются в единую строку :(
Теперь поставлю вопрос так (уже не знаю как сделать): как передать от TServerSocket все данные из TListBox'a которые лежат на серваке клиентскому приложению, где стоит TClientSocket и чтобы они загрузились в ListBox клиента :???:
Вообщем прочесал я весь код дебаггом. Такая фигня вышла, что сервер посылает запросы слишком быстро, а клиент не успевает их принимать, поэтому запросы накапливаются и превращаются в единую строку :(
Теперь поставлю вопрос так (уже не знаю как сделать): как передать от TServerSocket все данные из TListBox'a которые лежат на серваке клиентскому приложению, где стоит TClientSocket и чтобы они загрузились в ListBox клиента :???:
Разве сложно после получения клиентом строки, регулярным выражением, или функцией какой(я уже просто не помню) разбить строку на мелкие строки поместив их в масив? А разделителем считать \r\n
После этого пихнуть построно каждый элемент масива в List...
Цитата:
Originally posted by 3D Bob
Разве сложно после получения клиентом строки, регулярным выражением, или функцией какой(я уже просто не помню) разбить строку на мелкие строки поместив их в масив? А разделителем считать \r\n
После этого пихнуть построно каждый элемент масива в List...
Разве сложно после получения клиентом строки, регулярным выражением, или функцией какой(я уже просто не помню) разбить строку на мелкие строки поместив их в масив? А разделителем считать \r\n
После этого пихнуть построно каждый элемент масива в List...
Кстати, посмотри, как сделано у Борланда в $(BCB)\Demos\Internet\Chat. Воспроизводится ли твоя ошибка на их примере?