![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не запускается 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]сервер не успевает активизироваться