2012-08-13 2 views
7

vcl forms 클라이언트가있는 datasnap 서버가 있습니다. 클라이언트에서 서버가 종료를 말하고 기존 클라이언트 연결을 다시 시작하면 어떻게 처리 할 수 ​​있습니까? 이 시나리오에서는 10053 EIdSocketError 예외가 발생합니다.Datasnap and SocketError

복제하려면 서버와 클라이언트를 모두 실행하고 서버를 호출합니다 (DataSnap 프록시 생성기를 통해 노출 된 메소드 사용). 그런 다음 서버를 종료 (예 : 응용 프로그램 닫기)하고 다시 시작합니다. 그런 다음 서버에 다시 전화를 시도합니다.

예 : dspPolicyGroup은으로 TDataSetProvider하고 cdsPolicyGroup가 TClientDataSet의입니다

sm := TsvrPolicySearchClient.Create(datClientDB.SQLConnection1.DBXConnection); 
    try 
     ds := sm.SearchPolicyByPolicy(40, WCRef, '', 3); 
     dspPolicyGroup.DataSet := ds; 

     if cdsPolicyGroup.Active then 
     cdsPolicyGroup.Refresh 
     else 
     cdsPolicyGroup.Open; 

    finally 
     sm.Free; 
    end; 

CLIENT 호출 (난 그냥 로컬에 "저장"내 TDataSet의 결과를 사용).

서버에

function TsvrPolicySearch.SearchPolicyByPolicy(AClientId: Integer; WCRefNum, ClientRef: string; SearchMethod: Integer): TDataSet; 
begin 
    spPolicyByWCRef.Close; 
    spPolicyByWCRef.ParamByName('p_client').AsInteger := AClientId; 
    spPolicyByWCRef.ParamByName('p_search_method').AsInteger := SearchMethod; 
    spPolicyByWCRef.ParamByName('p_wc_refno').AsString := WCRefNum; 
    spPolicyByWCRef.Open; 
    Result := spPolicyByWCRef; 
end; 

나는이가 정기적으로 복제하는 것은 매우 쉬운 것을보고 사람들에 의해 발생 생각합니다. EIdSocketError (및 이와 동등한 것)를 확인하고 처리 할 때마다 각 호출 전에 "Test Connection"호출 또는 다른 것 (TestConnection 메서드와 같은)을 먼저 배치해야합니까? 아니면 아마도 디자인상의 결함일까요?

감사

답변

1

이 문제에 대한 가장 쉬운 해결 방법은 호출에에서 TDSServerClass 라이프 사이클 속성을 변경하는 것입니다. 이렇게하면 상태 비 저장 서버가 생기고 서버는 요청마다 새 세션을 생성합니다. 그러나 클라이언트 연결을 중단하지 않고 서버를 닫고 다시 연결할 수 있습니다.

2

내 시나리오 :

  • 클라이언트 응용 프로그램 (DataSnap 서버 방법을 사용하여)의 DataSnap 서버 (TCP/IP, 원격 서버)
  • 클라이언트 요청 데이터 집합에 연결합니다. TClientDataSet의
  • 클라이언트 다운로드 데이터 세트
  • 서버 종료 (에서 taskkill, 가까운 출원 번호 문제)
  • 클라이언트의 요청 데이터 집합의 againt (ehhrrr 소켓 오류)

솔루션 :

  • 클라이언트 I에 catch 예외 (AppEvents.OnException)
  • DataSnap 서버에 연결하면 소켓 오류임을 확인하십시오
  • 연결이 끊어진 정보가있는 대화 상자 창을 표시합니다. 사용자는 "RETRY"를 클릭 할 수 있습니다 -
    • 무료 및 연결을 데이터 세트 (연결 테스트를위한 특별한 데이터 집합을) 요청하는 응용 프로그램의 캐치 예외 전체 과정을 처음부터 작동하면 할
    • 시도를 DataSnap 클라이언트 모듈을 다시 만들고 초기화, 그렇다면.

이 작업 후 내 클라이언트의 DataSnap 서버에 재 - 연결하고 새로운 TCP/IP 연결을 사용하여 데이터 집합을 요청할 수 있습니다. 물론 사용자는 대화 상자를 닫을 수 있지만 응용 프로그램은 꺼집니다.

나는 이것이 당신을 도울 수 있다고 생각합니다. 나는 다른 많은 해결책을 시도했다 그러나 이것은 최고인 것을 입증했다. 또한 알고리즘은 클라이언트의 오류로 인한 연결 손실을 지원합니다.

관련 문제