Форум: "Сети";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
ВнизГлюк в TSocketConnection и в клиенте (Midas, DCOM) Найти похожие ветки
← →
maxi (2002-05-08 10:31) [0]Здрасте. У меня вопрос: есть Сервер приложений и клиентская часть. Вот часть клиента на коннект :
SocketConnection1.Open;
if SocketConnection1.Connected then
begin
MainData :=IRDMZadachdisp(SocketConnection1.GetServer);
.....
end;
Первый раз все происходит нормально, соединение устанавливается, а при попытке вызвать метод интерфейса тоже проблем нет.
Сервер рассылает сообщение о своем закрытии, моя программа отлавливает это сообщение клиетская часть делает disconnect:
SocketConnection1.Close;
Однако, сам клиент не выключается (выключаться не должен), просто должно разрываться соединение. При повторном запуске сервера где то на стороне, я вручную опять делаю коннект (по кнопке) смотри выше, где происходит:
...
MainData :=IRDMZadachdisp(SocketConnection1.GetServer);
...
Т.е. получаю новую ссылку на интерфейс. Однако при попытке вызова метода по новой ссылке , например MainData.MyMethod1(..)
у меня возникает исключение (типа Аксесс по адресу ХХХ денайд). Я нашел в чем проблема : если написать так
if MainData = nil then MainData:=IRDMZadachdisp
(SocketConnection1.GetServer);
то ошибка не возникает и методы проходят нормально. Появляется вопрос : Почему так ? Разве новая ссылка на интерфейс корявая ? Если да то почему ? Или надо до разрыва соединения уничтожать старую ссылку на интерфейс ? Тогда как ?
Посоветуйте ....
← →
Digitman (2002-05-08 10:54) [1]Не вдаваясь в подробности порекомендую самый простой вариант :
1. Коннект к удаленному MIDAS-AppServer"у
MainData :=IRDMZadachdisp(SocketConnection1.GetServer);
при выполнении строчки сначала происходит автоматическая попытка транспортного коннекта (неявный Open-метод) по заданным RemoteAddress/RemoteHostName/RemotePort, и , в случае успешного коннекта, запрашивается указанный интерфейс. В случае отказа транспортного коннекта либо отказа сервера в запрошенном интерфейсе произойдет исключение, фиксирующее факт невозможности получить доступ к IAppServer
2. Дисконнект
MainData := nil;
при выполнении строчки сначала происходит разрыв связи с удаленным IAppServer-объектом (сервер выгружает интерфейсный объект по инициативе клиента), затем - разрыв транспортного коннекта (неявный Close-метод)
P.S. Исключения, возбуждаемые TSocketConnection (относящиеся к гнездовому транспорту как таковому), асинхронны !
← →
maxi (2002-05-08 11:09) [2]Спасибо большое.
Только вопрос : означает ли операция MainData := Nil , что мы убираем ссылку на объект ? И означает ли, что в ваших случаях нет необходимости делать прямой Open или Close ?
← →
Romkin (2002-05-08 11:48) [3]MainData :=IRDMZadachdisp(SocketConnection1.GetServer);
Все дело в том, что при присвоении переменной-интерфейсу сразу вызывается MainData._AddRef, причем неявно
при новом присвоении компилятор делает проверку
if assigned(MainData) then MainData._Release;
Поскольку объекта уже нет, идет AV
Перед SocketConnection1.Close; (или на beforeDisconnect)
сделай MainData := nil,
если соединение уже разорвано, то pointer(MainData) := nil ; - здесь release не вызовется
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c