2012-08-13 34 views
7

Vcl form istemcisine sahip bir datasnap sunucum var. İstemciden, sunucu kapatma ve mevcut istemci bağlantılarıyla yeniden başlatıldıysa nasıl işleyebilirim? Bu senaryo, bir 10053 EIdSocketError istisnasını yükseltir.Datasnap ve SocketError

Çoğaltmak için, hem Sunucu hem de İstemci'yi çalıştırıyorum, sunucuya çağrı yapıyorum (DataSnap proxy oluşturucusuyla gösterilen yöntemleri kullanıyorum). Sonra sunucuyu kapatıyorum (örneğin uygulamayı kapatın) ve yeniden başlatın. Daha sonra sunucuya tekrar arama yapmayı deniyorum.

örn: dspPolicyGroup bir TDataSetProvider ve cdsPolicyGroup bir TClientDataSet olduğunu

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; 

MÜŞTERİ çağrısı (Sadece yerel olarak "store" benim TDataSet sonucunu kullanabilirsiniz).

SUNUCU

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; 

bu düzenli olarak çoğaltmak için oldukça kolay olduğunu görünce insanlar tarafından karşılaşılan düşünürdüm. EIdSocketError (ve eşdeğeri) kontrol etmek ve işlemek için her aramadan önce bir "Test Bağlantısı" araması veya ilk önce bir şey (TestConnection gibi bir yöntem) yerleştirmeli miyim? Yoksa belki de bir tasarım hatası mı?

Teşekkür

cevap

1

Bu sorunun en kolay çözüm Invocation için TDSServerClass LifeCycle niteliğini değiştirmektir. Bu, durum bilgisi olmayan bir sunucuya sahip olmanıza neden olacak ve sunucu istek başına yeni bir oturum oluşturacaktır. Ancak, istemcilerin bağlantısını kesmeden sunucuyu kapatabilir ve yeniden bağlayabilirsiniz.

2

Benim senaryo:

  • İstemci uygulaması (DataSnap sunucu yöntemleri kullanılarak) DataSnap Server (TCP/IP, uzak sunucu)
  • Müşteri isteğine bir DataSet bağlanın. TClientDataSet
  • Müşteri indirilen veri kümesi
  • Sunucu kapatma (taskkill, kapatma uygulaması hususa)
  • Müşteri isteği bir DataSet againt (ehhrrr Yuva Hatası)

Çözüm:

  • istemci Açık I özel durumu yakalama (AppEvents.OnException)
  • VeriSnap sunucusuna bağlantıdan soket hatası olduğunu kabul edin
  • Bağlantı kayıp olduğu bilgisini içeren bir iletişim penceresi gösteriyorum. Kullanıcı "RETRY" tıklayabilirsiniz -
    • Ücretsiz ve bağlantısını veri kümesi (bağlantı testi için özel veri kümesini) istemek uygulama yakalamak istisna tüm süreç baştan çalışıp çalışmadığını için
    • deneyin DataSnap istemci modülü yeniden oluşturmak ve başlatmak, eğer öyleyse.

Bu işlemden sonra benim Müşteri DataSnap sunucusuna yeniden bağlanmak ve yeni TCP/IP bağlantısı kullanarak veri kümesi talep edebilirsiniz. Tabii ki kullanıcı diyaloğu kapatabilir, ancak uygulama kapanır.

Bence bu size yardımcı olabilir. Diğer birçok çözümü denedim ama bu en iyisi oldu. Ayrıca algoritma, müşterinin hatasıyla bağlantı kaybını da destekler.