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

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

Почему то не работает TClientSocket (RAD2010)


Pcrepair ©   (2012-09-25 23:37:00) 

Добрый день. решил попробовать сокеты.
такой код:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Host := '127.0.0.1';  (*тут веб-сервер*)
  ClientSocket1.Port := 80;
  ClientSocket1.Open;
  (*специально для проверки дописал вот это*)
  if ClientSocket1.Active = True then
  Label1.Caption:='IT OPEN'; (*лейбл показывает что сокет не запустился, не активный*)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientSocket1.close;
end;

Пробовал в режиме трассировки. доходит до Button1Click - и ничего. а вот Button2Click нормально проходит трассировку
пробовал далее  ClientSocket1.Socket.SendText('GET /index.php HTTP/1.1'#13#10); по ClientSocket1Connect и далее Memo1.Lines.Add(Socket.ReceiveText), но конечно ничего не вышло, поскольку метод OPEN не работает?

Вопрос: может что не так в синтксисе? все примеры из Д7


Сергей М.   (2012-10-17 10:15:00) [1]


> ClientSocket1.Create(nil);


Мдя ..
Сложно выдумать бред бредовей чем реинициализация ужесуществующего экземпляра TClientSocket)


> ClientSocket1.Free;


Это тоже порадовало - TClientSocket по всей вероятности ужележит на форме, это означает что форма при создании сама автоматически создаст и инициализирует объект, соответственно при разрушении сама же автоматически его уничтожит.


avtomk@narod.ru   (2012-10-17 02:41:00) [2]

Удалено модератором
Примечание: не надо писать чушь


Сергей М.   (2012-09-27 09:42:00) [3]

В условиях полной неадаптированности пакета этих компонентов к юникоду работать они как им положено не будут.


Pcrepair   (2012-09-27 09:04:00) [4]

ну есть и другие варианты, на месте никто не стоит

implementation

{$R *.dfm}

procedure TForm1.btn2Click(Sender: TObject);
begin
 ClientSocket1.Socket.SendText(mmoSendText.Text);       //посылаем сообщение
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
ClientSocket1.Port := StrToInt(edtPort.text);        //устанавливаем порт
ClientSocket1.Address := edtIP.text;                 //IP адресс сервера  если на одном компе можно просто 192.168.1.2
//ClientSocket1.Host:=edtIP.text;  (*только для имени далее ДНС получает адрес*)
ClientSocket1.Active :=True;                         //Коннектимся
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Active :=False;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 Form1.Caption := 'Подключились к ' + edtIP.text;      //Если подключились покажем это, ВОТ ТУТ показывает что подключилось к какому угодно IP в том числе несуществующему
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
form1.Caption := 'Связь разорвана';                  //Связь разорвана =(
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
ShowMessage('Ошибка №' +  IntToStr(ErrorCode));    //Возникла ошибка
ErrorCode :=0;                                     //Забъем на нее
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 mmoMsg.Lines.Add('[Server]::' + Socket.ReceiveText); //Нам сообщенице
end;

end.


Сергей М.   (2012-09-26 22:00:00) [5]


> откуда такая информация, что цокет неблокирующий?


Оттуда.
Блокирующий сокет при неуспешной попытке подключения возбудит исключение, и до строки if ClientSocket1.Active = True thenвыполнение программы попросту не дойдет.


> оно все равно выдает что OnConnect есть


Кто "оно" ?)
В приведенном тобой коде нет ни малейшего намека на обработку ни одного из событий сокета, коих у него немало и каждое из которых весьма важно при работе в неблок.режиме и совершенно неважно иначе)


Pcrepair   (2012-09-26 19:19:00) [6]

откуда такая информация, что цокет неблокирующий? и в том и в другом случае результат одинаковый

кстати по поводу события OnConnect...
можно выставить какой угодно ИП-адрес а оно все равно выдает что OnConnect есть. а к чему оно подключается когда такого ИП-адреса в сети просто нет?


Сергей М.   (2012-09-26 15:36:00) [7]

> лейбл показывает что сокет не запустился, не активный

И правильно показывает.
Сокет-то неблокирующий..
И "запустится" он не раньше события OnConnect.
Или не "запустится", но не раньше события OnError.


Pcrepair   (2012-09-26 14:20:00) [8]

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


Dimka Maslov   (2012-09-26 10:09:00) [9]

Остаётся теперь только задаться вопросом, а есть ли на компьютере с адресом 127.0.0.1 активный сервер, слушающий порт 80. А есть ли вообще... Впрочем об этом ужа давно всё сказано.


Сергей М.   (2012-09-26 09:24:00) [10]

Это сокеты виноваты.
Если бы не сокеты, то нажимаем батон1 и сразу видим "чего".
Не пробовал бы ты их - кислые они.


> может что не так в синтксисе?


Ты же уже до трассировкидошел, какой к лешему синтаксис ?
Трассировка не может быть осуществлена, если код не скомпилирован в принципепо причине, например, "не так в синтксисе".


Pcrepair   (2012-09-26 08:10:00) [11]

нажимаем на Ф7, идет компиляция программы. одно, другое и так до появления формы с кнопками. нажимаем батон1 - ничего. нажимаем батон2 - как положено переходить к обработчику и далее.


Германн   (2012-09-26 01:55:00) [12]


> Пробовал в режиме трассировки. доходит до Button1Click -
>  и ничего. а вот Button2Click нормально проходит трассировку

Переведи.


Плохиш   (2012-09-26 00:12:00) [13]

У TClientSocket есть парный ему класс.


Наверх

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