Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не запускается TClientSocket [D7, Win95/98, WinXP]


OlegM ©   (2004-05-20 13:14:00) 

Привет всем!
Вот не пойму что такое когда пишу так клиент не запускается
     ServerSocket1.Port:=9999;
     ServerSocket1.Open;
     ClientSocket1.Close;
     ClientSocket1.Host:='localhost';
     ClientSocket1.Port:=9999;
     ClientSocket1.Open;
а когда например сервер запускаю по нажатию одной кнопки а клиента по нажатию другой то все робит в чем проблема?


OlegM   (2004-05-21 13:27:00) [1]

Пошел мылить(


Digitman   (2004-05-21 13:22:00) [2]


> Че теперь делать даже незнаю(


ну что делать ?
мыль веревку, потому как до кучи еще и Server.OnAccept у тебя при таких чудесах может оказаться позднее OnClientWrite)

либо выкидывай к шутам свои ShowMessage, расставляй брейкпойнты в обработчиках ВСЕХ БЕЗ ИСКЛЮЧЕНИЯ событий обоих компонентов, бери в руки бамажку и записывай на нее ТОЧНУЮ И ЗАВЕДОМО ПРАВИЛЬНУЮ последовательность возбуждения событий


OlegM   (2004-05-21 13:03:00) [3]

Ну вот незнаю если так оно и есть, может конечно я туплю по полной, но я просто сделал showmessage поставил на эти события и все ,ну вот в таком порядке как написал они и вышли
Че теперь делать даже незнаю(


Digitman   (2004-05-21 13:00:00) [4]


> OlegM ©   (21.05.04 12:02) [15]
> На OnError ни у клиента ни у сервера ошибок невыдает, а
> вот на событии сервера OnClientConnect срабатывает


значит ты лапшу мне вешаешь : коннект успешно осуществляется


> сначала срабатывает событие Server.OnClientWrite а только
> потом Server.OnClientConnect


да быть того не может !

OnClientConnect свидетельствует о факте коннекта как такового, а OnClientWrite - о фактической готовности гнезда к передаче ...

как, по твоему, гнездо может стать готовым к передаче, если факта коннекта еще не было ? куда/кому гнездо передавать-то будет ?


OlegM   (2004-05-21 12:43:00) [5]

Да вот еще что сначала срабатывает событие Server.OnClientWrite а только потом Server.OnClientConnect


OlegM   (2004-05-21 12:02:00) [6]

На OnError ни у клиента ни у сервера ошибок невыдает, а вот на событии сервера OnClientConnect срабатывает я там просто showmessage поставил


Digitman   (2004-05-21 09:55:00) [7]

1. Возбуждается ли событие OnConnect() ?

2. Если возбуждается, кто первым - клиент или сервер - инициирует обмен (вызывает SendText) ? По факту какого события ?

3. Если НЕ возбуждается, то что показывает обработка OnError()

4. Где собственно обработка OnError() ? Почему нет обработки On[Client]Write () ? САМЫЙ первый вызов ЛЮБОГО Send-метода на любой из сторон соединения должен происходить НЕ РАНЕЕ возбуждения события On[Client]Write() !

5. Где анализ результата вызова SendText() ? На любой из сторон соединения ?

ВАЖНО !!!!

При использовании режима ctNonBlocking вызов кл.стороной на выполнение метода Open() и последующее успешное исполнение метода НЕ ОЗНАЧАЕТ успешное подключение : метод Open() в этом случае лишь инициирует попытку коннекта с сервером;

Факт успешной попытки коннекта есть факт возбуждения на кл.стороне события OnConnect();

Факт НЕуспешной попытки коннекта есть факт возбуждения на кл.стороне события OnError(), в обработчике которого следует выполнить как минимум Socket.Close;

Признаком возможности инициации обмена (непосредственно после факта коннекта) явл-ся факт возбуждения на любой из сторон события On[Client]Write();


OlegM   (2004-05-21 09:31:00) [8]

Думал понямаю,а оказалось нет)))
Вот
procedure TChatForm.ClientSocket1Lookup(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 statusbar1.Panels[0].Text:='Ищем сервер...';
end;

procedure TChatForm.ClientSocket1Connecting(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 statusbar1.Panels[0].Text:='Соединяемся...';
end;

procedure TChatForm.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 statusbar1.Panels[0].Text:='Соеденились';
end;

procedure TChatForm.ClientSocket1Disconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 statusbar1.Panels[0].Text:='Отсоеденились';
end;

procedure TChatForm.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
 var s,from_,to_: string;
 Flags: TReplaceFlags;
 i:integer;
begin
 Flags:= [ rfReplaceAll ];
 s := Socket.ReceiveText;
 if Copy(s,1,2) = '#U' then
 begin
   Delete(s,1,2);
   ListBox1.Items.Clear;
   while Pos(';',s) > 0 do
   begin
     ListBox1.Items.Add(Copy(s,1,Pos(';',s)-1));
     Delete(s,1,Pos(';',s));
   end;
   Exit;
 end;

 if Copy(s,1,2) = '#M' then
 begin
   Delete(s,1,2);
   richviewedit1.InsertText(chr(10)+stringreplace(s,';',' - ',flags),false);
   Exit;
 end;

 if Copy(s,1,2) = '#N' then
 begin
   Socket.SendText('#N'+nickname);
   Exit;
 end;
end;


Digitman   (2004-05-21 09:24:00) [9]

ты русский язык понимаешь ?

я тебя спросил, какие события клиентского(!!) гнезда и как обрабатываешь ?


OlegM   (2004-05-21 09:05:00) [10]

В ListBox у меня заносятся имена пользователей
вот весь код
............сервер
procedure TChatForm.ServerSocket1Accept(Sender: TObject;
 Socket: TCustomWinSocket);
var i: Integer;
begin
 ListBox1.Items.Clear;
 for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do ServerSocket1.Socket.Connections[i].SendText('#N');
end;

procedure TChatForm.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var s: string;
    i: Integer;
begin
 s := Socket.ReceiveText;
 if Copy(s,1,2) = '#N' then
 begin
   Delete(s,1,2);
   ListBox1.Items.Add(s);
   s := '#U';
   for i := 0 to ListBox1.Items.Count-1 do s := s+ListBox1.Items[i]+';';
   for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do ServerSocket1.Socket.Connections[i].SendText(s);
   Exit;
 end;

 if (Copy(s,1,2) = '#M') or (Copy(s,1,2) = '#P') then
 begin
   for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
     ServerSocket1.Socket.Connections[i].SendText(s);
   Exit;
 end;
end;
..........сервер

Вот он и добавляет в листбокс имя пользователя


Digitman   (2004-05-21 08:18:00) [11]


> и видно что они соеденились


"видно" - это как ? какие события кл.гнезда и как обрабатываешь ?


OlegM   (2004-05-20 19:52:00) [12]

Ну вот на форме две кнопки, по нажатию одной запускаю сервер, по нажатию другой запускаю клиента, и видно что они соеденились, но когда весь код в одной кнопке ну неполучается и все тут весь день долбаюсь уже, хотя это мои первые попытки роаботы с этими компонентами.


Digitman   (2004-05-20 17:46:00) [13]

да, ServerSocket после вызова Open() сразу же переходит в состояние Active = True, так что насчет цикла ожидания это я загнул

но я не понимаю какие у тебя проблемы !


> а когда например сервер запускаю по нажатию одной кнопки
> а клиента по нажатию другой то все робит


что такое "все робит" в дан.случае ?


Digitman   (2004-05-20 17:35:00) [14]


> он туда даже не заходит


ктоне заходит ? кудане заходит ?

изволь выражаться языком программиста, а не путешественника ..


OlegM   (2004-05-20 17:13:00) [15]

Ну неполучается и все тут
Вот что у меня
ServerSocket1.Port:=9999;
ServerSocket1.Open;
while not ServerSocket1.Active do
 Application.Processmessages;
ClientSocket1.Host:='localhost';
ClientSocket1.Port:=9999;
ClientSocket1.ClientType:=ctBlocking;
ClientSocket1.Open;
и нифига, по циклу он туда даже не заходит


Digitman   (2004-05-20 14:52:00) [16]

все "робит", не выдумывай .. что вообще сие означает - "клиент не запускается" ?

у тебя клиент в режиме ctNonBlocking ?

на каком же основании ты уверен, что клиент станет активным сразу же при Open() ?


OlegM   (2004-05-20 14:38:00) [17]

Что то не робит(


Digitman   (2004-05-20 14:09:00) [18]

жди в цикле
while not ServerSocket1.Active do
  Application.Processmessages;


OlegM   (2004-05-20 14:01:00) [19]

И как быть тогда?


Digitman   (2004-05-20 13:47:00) [20]

сервер не успевает активизироваться


Наверх

Титульная страница Поиск, карта сайта Написать письмо