Форум: "Сети";
Текущий архив: 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.033 c