Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

Почему не запускается TClientSocket   Найти похожие ветки 

 
OlegM ©   (2004-05-20 13:14) [0]

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


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

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


 
OlegM ©   (2004-05-20 14:01) [2]

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


 
Digitman ©   (2004-05-20 14:09) [3]

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


 
OlegM ©   (2004-05-20 14:38) [4]

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


 
Digitman ©   (2004-05-20 14:52) [5]

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

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

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


 
OlegM ©   (2004-05-20 17:13) [6]

Ну неполучается и все тут
Вот что у меня
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 17:35) [7]


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


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

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


 
Digitman ©   (2004-05-20 17:46) [8]

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

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


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


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


 
OlegM ©   (2004-05-20 19:52) [9]

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


 
Digitman ©   (2004-05-21 08:18) [10]


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


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


 
OlegM ©   (2004-05-21 09:05) [11]

В 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 09:24) [12]

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

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


 
OlegM ©   (2004-05-21 09:31) [13]

Думал понямаю,а оказалось нет)))
Вот
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:55) [14]

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 12:02) [15]

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


 
OlegM ©   (2004-05-21 12:43) [16]

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


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


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


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


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


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

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

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


 
OlegM ©   (2004-05-21 13:03) [18]

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


 
Digitman ©   (2004-05-21 13:22) [19]


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


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

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


 
OlegM ©   (2004-05-21 13:27) [20]

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



Страницы: 1 вся ветка

Текущий архив: 2004.07.18;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.044 c
9-1080314417
dimych
2004-03-26 18:20
2004.07.18
Второй метод создания игровых карт


4-1086374242
AVK
2004-06-04 22:37
2004.07.18
Отловить сообщение завршения Windows


14-1088426606
Sodom
2004-06-28 16:43
2004.07.18
Доменная авторизация. Создание своего модуля к apache.


6-1084950938
TransparentGhost
2004-05-19 11:15
2004.07.18
Где находится TRASConn и RASEnumConnectionsA ?


14-1088491127
StarCon
2004-06-29 10:38
2004.07.18
Java vs Delphi