2012-08-13 15 views
7

Tôi có một máy chủ datasnap với một máy khách dạng vcl. Từ máy khách, làm thế nào tôi có thể xử lý nếu máy chủ đã được nói tắt máy và khởi động lại với các kết nối máy khách hiện có? Kịch bản này làm tăng ngoại lệ 10053 EIdSocketError.Datasnap và SocketError

Để tái tạo, tôi chạy cả Máy chủ và Máy khách, thực hiện cuộc gọi đến máy chủ (Tôi sử dụng các phương thức được hiển thị thông qua trình tạo proxy DataSnap) để khởi động. Sau đó tôi tắt máy chủ (ví dụ Đóng ứng dụng) và khởi động lại nó. Sau đó tôi cố gọi lại máy chủ.

ví dụ: KHÁCH HÀNG gọi

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; 

dspPolicyGroup là một TDataSetProvider và cdsPolicyGroup là một TClientDataSet (tôi chỉ sử dụng nó tại địa phương đến "cửa hàng" Kết quả TDataSet của tôi).

MÁY CHỦ

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; 

tôi sẽ nghĩ rằng đây là thường xuyên gặp phải bởi những người thấy rằng nó khá dễ dàng để tái tạo. Tôi có nên đặt một cuộc gọi "Kiểm tra kết nối" hoặc một cái gì đó đầu tiên (chẳng hạn như một phương pháp TestConnection) trước mỗi cuộc gọi để kiểm tra EIdSocketError (và tương đương) và xử lý? Hay nó là một lỗ hổng thiết kế có lẽ?

Cảm ơn

Trả lời

1

Cách giải quyết dễ nhất cho vấn đề này là thay đổi thuộc tính TDSServerClass LifeCycle thành Gọi. Điều này sẽ khiến bạn có máy chủ không trạng thái và máy chủ sẽ tạo phiên mới theo yêu cầu. Tuy nhiên, bạn sẽ có thể đóng và kết nối lại máy chủ mà không làm gián đoạn kết nối máy khách.

2

kịch bản của tôi:

  • ứng dụng Client kết nối với DataSnap Server (TCP/IP, máy chủ từ xa)
  • yêu cầu khách hàng một DataSet (sử dụng phương pháp máy chủ DataSnap). TClientDataSet
  • Khách hàng tải dữ liệu
  • server shutdown (taskkill, đóng ứng dụng không có vấn đề)
  • yêu cầu khách hàng một DataSet againt (ehhrrr Lỗi Socket)

Giải pháp:

  • On client tôi bắt ngoại lệ (AppEvents.OnException)
  • Nhận biết đó là lỗi Socket khi kết nối với máy chủ DataSnap
  • Tôi hiển thị cửa sổ hộp thoại với thông tin kết nối bị mất. Người dùng có thể nhấp vào "Thử lại" - nếu như vậy,
    • miễn phí và tái tạo mô-đun khách hàng DataSnap và khởi tạo kết nối
    • Hãy thử để yêu cầu dữ liệu (dataset đặc biệt để kiểm tra kết nối) nếu ứng dụng bắt ngoại lệ toàn bộ quá trình làm việc ngay từ đầu.

Sau hoạt động này khách hàng của tôi tái kết nối với máy chủ DataSnap và có thể yêu cầu dữ liệu sử dụng kết nối TCP/IP mới. Tất nhiên người dùng có thể đóng hộp thoại, nhưng sau đó ứng dụng bị tắt.

Tôi nghĩ điều này có thể giúp bạn. Tôi đã thử nhiều giải pháp khác nhưng điều này được chứng minh là tốt nhất. Hơn nữa thuật toán cũng hỗ trợ mất kết nối với lỗi của khách hàng.

Các vấn đề liên quan