Я создал автономный TCP/IP-сервер Datasnap с помощью Мастера. Я выбрал образцы методов (эхострим и реверсивность). Я сохранил сервер и запустил его. Затем я создал клиентское приложение и использовал файл-новый-другой, добавленный ClientModule к этому проекту клиента, а также блок ClientClasses. На основной форме. Я добавил кнопку. На OnClick обработчик события кнопки, я добавил следующий код:Ошибка Delphi 10 Seattle Datasnap: «Не удалось выполнить операцию. Соединение было закрыто».
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientModule1.SQLConnection1.Connected then
begin
Button1.Text := 'Open';
ClientModule1.SQLConnection1.Close;
end
else
begin
Button1.Text := 'Close';
// ClientModule1.SQLConnection1.Open;
ClientModule1.ServerMethods1Client.ReverseString('myteststring');
end;
end;
Целью здесь является смоделировать ситуацию, когда клиент при входе в систему и выход из сервера регулярно, а не по поддержанию связи. Это особенно важно для приложений, развернутых на мобильных устройствах.
Вы можете видеть, что я прокомментировал Connection.Open, потому что первый вызов ServerMethods1client открывает соединение. Сгенерированный код показан здесь:
function TClientModule1.GetServerMethods1Client: TServerMethods1Client;
begin
if FServerMethods1Client = nil then
begin
SQLConnection1.Open;
FServerMethods1Client := TServerMethods1Client.Create(SQLConnection1.DBXConnection, FInstanceOwner);
end;
Result := FServerMethods1Client;
end;
Теперь проблема возникает. При первом нажатии на кнопку соединение открывается и вызывается метод. При втором нажатии кнопки соединение закрывается. На третьем клике возникает исключение «Операция с ошибкой. Соединение закрыто» с помощью кода TDBXCommand.
В качестве обходного пути, я попытался это:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientModule1.SQLConnection1.Connected then
begin
Button1.Text := 'Open';
ClientModule1.SQLConnection1.Close;
ClientModule1.ServerMethods1Client := nil;
end
else
begin
Button1.Text := 'Close';
// ClientModule1.SQLConnection1.Open;
ClientModule1.ServerMethods1Client.ReverseString('myteststring');
end;
end;
Это бы-решить эту проблему, так как экземпляр FServerMethods1Client в ClientModule1 является сброс поэтому создать код работает снова, как это было на первом плане.
Единственная другая проблема сейчас, это (я использую Eurekalog), она создает утечку памяти.
Что я делаю неправильно? Каков правильный способ подключения/отключения от сервера Datasnap, не перезагружая приложение?
Это работает, хотя было бы более эффективно поддерживать экземпляр прокси-сервера клиента при условии, что соединение открыто, а не создавать и уничтожать новый экземпляр каждый раз. Распределение/управление памятью дорого, особенно по сравнению с альтернативой (не повторяя это). –
Я смущен тем, что вы ответили на свой вопрос и отметили его как ответ, когда предоставленная вами информация действительно не является ответом на исходный вопрос. –
Вы, конечно же, можете получить полный ответ. Между тем, мой собственный ответ достаточно, не так ли? – nolaspeaker