Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];

Вниз

Почему не запускается 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.026 c
14-1088395865
ИМХО
2004-06-28 08:11
2004.07.18
Еще раз о спаммерах


8-1083581189
Pavel
2004-05-03 14:46
2004.07.18
Заголовки OpenGl


1-1088931071
ida
2004-07-04 12:51
2004.07.18
Как копировать в StringGrid?


6-1084979142
Ahven
2004-05-19 19:05
2004.07.18
WinSock: gethostbyaddr vs getnameinfo


14-1088597742
Феликс
2004-06-30 16:15
2004.07.18
Задачи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский