|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Непонятно откуда берущаяся ошибка с ClientSocket
Приветствую всех и каждого.
Перейду сразу к делу. Использую два компонента: TClientSocket и TServerSocket. С TServerSocket проблем нет, корректно поднимаю сервер с указанным пользователем портом (стараюсь не использовать зарезервированные, использую 1111). Затем подключаюсь к серверу через TClientSocket. Вот тут как раз возникает странная для меня вещица. Опишу по шагам, что есть и что не нравится. 1 шаг: указываю TClientSocket заведомо неверный адрес и порт - ругается, как ему и положено. 2 шаг: указываю верные адрес и порт - не коннектиться и ругается (почему понятно, но так не должно быть). 3 шаг: просто еще раз пытаюсь коннектиться по верным адрес и порту - коннектиться так, как и должен был во втором шаге, но уже без каких-либо ошибок. Меня как раз этот второй шаг и напрягает - ошибка понятная, но непонятно, с какого дуба она тут. Прошу помочь разобраться (не просто избавиться от ошибки, а объяснить причину ее возникновения и правильное ее лечение). Заранее всем спасибо! |
#2
|
||||
|
||||
здесь все с первого раза работает?
http://data.cod.ru/67333 |
#3
|
|||
|
|||
Ты меня не понял. Прочитай внимательнее, когда именно ошибка возникает. Ибо даже в моем примере все корректно работает, если сразу же вести правильные данные. И вся соль в real-time.
Прикрепляю сам проект, чтобы было легче все понять и просмотреть |
#4
|
||||
|
||||
почему выкладывать исходник с TMyConnection, TMyTable, TMyTable, TMyQuery если ни у кого этого нет? теперь понятно зачем я свой выложил?
по поводу проблемы могу посоветовать 100% рабочий вариант: Код:
procedure TForm1.ConnectToBtnClick(Sender: TObject); begin if ClientSocket1.Active then begin ClientSocket1.Active := False; ConnectToBtn.Caption := 'Соединиться' end else begin ClientSocket1.Free; ClientSocket1:=TClientSocket.Create(Self); ClientSocket1.OnConnect:=ClientSocket1Connect; ClientSocket1.OnDisconnect:=ClientSocket1Disconnect; ClientSocket1.OnError:=ClientSocket1Error; ClientSocket1.Host := HostNameEdit.Text; ClientSocket1.Port := StrToInt(PortToEdit.Text); // соединяемся с сервером ClientSocket1.Active := True end end; |
#5
|
|||
|
|||
Во-первых, если посмотреть внимательнее, то компоненты MyDac пока даже не использовались. Они закинуты на будущее.
Во-вторых, второй твой ответ помог. Я тоже думал, что нужно рефрешнуть компонент, но не знал, как правильно это делается. Спасибо большое за помощь! |
#6
|
||||
|
||||
Код:
ClientSocket1.Free; ClientSocket1:=TClientSocket.Create(Self); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
||||
|
||||
Цитата:
ClientSocket1.Free; ClientSocket1:=TClientSocket.Create(Self); никогда не вызовет эксепшена (при нормальных условиях работы системы) если есть способ вызвать эксепшн - буду счастлив лицезреть его |
#8
|
|||
|
|||
Зачем тогда его уничтожать, если ты его кинул на форму, то есть, по логике твоей программы, при запуске, создается ClientSocket, при подключении, ты его уничтожаешь, и создаешь новый, с точки зрения программирования, это очень грубо и глупо. Я бы вообще отказался от уничтожения данного компонента, а продолжал бы работь с одним экземпляром от начала и до конца.
|
#9
|
||||
|
||||
Цитата:
|
#10
|
|||
|
|||
Вот этого должно быть достаточно:
Код:
procedure TForm1.ConnectToBtnClick(Sender: TObject); begin if ClientSocket1.Active then begin ClientSocket1.Active := False; ConnectToBtn.Caption := 'Соединиться' end else begin ClientSocket1.Host := HostNameEdit.Text; ClientSocket1.Port := StrToInt(PortToEdit.Text); ClientSocket1.Active := True; end end; Сейчас система электронного отображения расписания работает как по часам, глянул исходники, у меня они от выже изложенного варианта фактически не отличаются. |
#11
|
||||
|
||||
самому интересно почему так происходит)
вот создал простейший пример с такой же бякой: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ScktComp, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; ClientSocket1: TClientSocket; ServerSocket1: TServerSocket; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin ClientSocket1.Close; ClientSocket1.Port:=80; ClientSocket1.Host:='noname'; ClientSocket1.Open; end; procedure TForm1.Button2Click(Sender: TObject); begin ClientSocket1.Close; ClientSocket1.Port:=1234; ClientSocket1.Host:='localhost'; ClientSocket1.Open; end; procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin Memo1.Lines.Add(SysErrorMessage(ErrorCode)); ErrorCode:=0; end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add('ClientConnect'); end; procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add('ClientDisconnect'); end; procedure TForm1.FormCreate(Sender: TObject); begin ServerSocket1.Port:=1234; ServerSocket1.Open; end; end. при нажатии Button2 клиент сразу же подключается к серверу (в Memo1 выводится ClientConnect) но если сначала нажать Button1, то естественно (через некоторое время ~3сек) происходит ClientSocket1Error, и если жмем Button2, то по идее должно быть все ок, но опять получаем ClientSocket1Error. почему? проверено на XP и 7, лицензии со всеми обновлениями -- я всегда использую блокируемые сокеты (тут ctNonBlocking), поэтому раньше с таким не встречался Последний раз редактировалось NumLock, 04.05.2012 в 10:45. |