TIdContext Kimlik Bilgisi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

TIdContext Kimlik Bilgisi

Mesaj gönderen vkamadan »

Merhaba ,
Bilindiği gibi TidTCPServer ,a her bağlantı açıldığında OnExecute olayında "AContext" değişkenine bağlanan istemciye özel bir Thread oluşuyor , IP numarası haricinde bu Context leri birbirinden ayırabileceğim bir ID , index vb bir özellik var mı ?
Aynı makina üzerinde istemci program birden fazla çalıştırıldığında sunucu uygulama üzerinde context ler hep aynı IP den geldiği için cevap vermem gerektiğinde context i sadece IP den eşleyemiyorum, kendi listemi oluşturarak bunu yapabilirim ama canlı bağlantıların takibi vb konularda denetimi elimde tutmayı pek tercih etmem, "LockList" in döndürğü context list üzerinden hareket etmek tercihimdir, hali hazırda sorunumu çözebilecek bir yöntem var mı ? öğrenmek istedim.

İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TIdContext Kimlik Bilgisi

Mesaj gönderen SimaWB »

Ben sorunu tam olarak anlayamadım. Zaten OnExecute'da cevap verdiğinde hangi istemci bağlı ise ona cevap vereceksin. Neden sorun oluyor?
Belki biliyorsundur ama yine de yazayım: TCPServer'ın ContextClass'ında değişiklik yaparak istediğin veriyi TIdContext içinde tutabilirsin:

Kod: Tümünü seç

  TYourContext = class(TIdServerContext)
  private
    FYourData: integer;
  public
    constructor Create(AConnection: TIdTCPConnection; AYarn: TIdYarn; AList: TThreadList = nil); override;
    property YourData: integer read FYourData write FYourData;
  end;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  TCPServer.ContextClass := TYourContext;
end;

procedure TFormMain.TCPServerConnect(AContext: TIdContext);
begin
  //değişkenlerine aşağıdaki şekilde ulaşırsın
  TYourContext(AContext).YourData
end;
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: TIdContext Kimlik Bilgisi

Mesaj gönderen vkamadan »

Sayın @SimaWB öncelikle verdiğin açıklayıcı örnek için teşekkür ederim, yapmak istediğim olayı şöyle örnekleyeyim ,

TidTCPServer uygulamasına bir çok, TidTCPClient uygulaması bağlanacak, bu clientler farklı makineler de olabileceği gibi bazı clientler aynı makinadaki farklı uygulamalardan gelmiş olabilirler (sorun bu noktada çıkıyor) , gelen isteğe anında cevap verceğim durumlarda sorun yok zaten , fakat bir client tan başka bir client a tetikleyici bir mesaj taşımam gerektiğinde, içeride tuttuğum bağlı kullanıcı listesinde diğer clientı kesin olarak bulmalıyım ,
örneğin bir client başka bir client ekranına uyarı mesajı göndermek istediğimde ben 1nolu clientten server uygulamasına "[KAYNAK_CLIENT_KIMLIGI] ; [HEDEF_CLIENT_KIMLIGI];[KOMUT]" gibi mesaj göndereceğim server içerde tutuğum listedeki PeerIP dışında kesin ayırıcı bir bilgi olan HEDEF_CLIENT_KIMLIGI ile eşleşen CONTEXT e bilgiyi gönderecek, böyle bir şey için gerekti, sanırım liste yi kendim kontrol altında tutmalıyım.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TIdContext Kimlik Bilgisi

Mesaj gönderen SimaWB »

Şimdi anladım. Bu durumda sizin de dediğiniz gibi kendiniz kontrol etmeniz gerekiyor. Client'lar ilk bağlantı kurdukları mesaj içerisinde UserID tarzında birşey gönderip server'da bunları saklamanız gerekecek. Indy'nin Chat demosu vardı yanlış hatırlamıyorsam. İşinize yarayabilir.
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: TIdContext Kimlik Bilgisi

Mesaj gönderen vkamadan »

Evet dediğiniz gibi bir liste ile takip etme yapısı kuruyorum peki şunu sorayım şöyle bir tespitim oldu ,
listemdeki AContext lerin canlı olup olmadığını kontrol etmenin bir yolunu ararken farkettim ki

Kod: Tümünü seç

 if Assigned( MyContextList[i].Connection) then ....
bağlantısı kopan context lerin "Connection" propertisi "nil" oluyor bunu çeşitli varyasyonlarla test ettim kullanıcı kendisi Disconnet olabilir, makinası kapanabilir, program zorla kapatılabilir, her durumda context.connection=nil oldu, size buna güvenebilirmiyim başka bir yola gerek var mı?
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TIdContext Kimlik Bilgisi

Mesaj gönderen SimaWB »

Söylediğinizi daha önce denemedim, şuanda da deneme şansım yok. Ama makinası kapanmış bir client yada ethernet kablosu çıkartılmış bir client için nil dönüyorsa bence güvenilebilir. Şunu eklemek isterim; kendiniz bir liste oluşturup kontrol etmenize gerek yok. Zaten TCPServer.Contexts şeklinde hazır bir listeniz var. (Hem de thread-safe :) )
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: TIdContext Kimlik Bilgisi

Mesaj gönderen vkamadan »

SimaWB yazdı:Şunu eklemek isterim; kendiniz bir liste oluşturup kontrol etmenize gerek yok. Zaten TCPServer.Contexts şeklinde hazır bir listeniz var. (Hem de thread-safe :) )
Evet o listeyi biliyorum fakat clientleri birbirinden IP harici ayırmak için kullanacağım CLientID vb bir değişken olsaydı harika olacaktı
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TIdContext Kimlik Bilgisi

Mesaj gönderen SimaWB »

vkamadan yazdı:
SimaWB yazdı:Şunu eklemek isterim; kendiniz bir liste oluşturup kontrol etmenize gerek yok. Zaten TCPServer.Contexts şeklinde hazır bir listeniz var. (Hem de thread-safe :) )
Evet o listeyi biliyorum fakat clientleri birbirinden IP harici ayırmak için kullanacağım CLientID vb bir değişken olsaydı harika olacaktı
İlk yazdığım cevaptaki gibi kendi context'inizi oluşturursanız kendi listeniz de otomatik oluşmuş olur.
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: TIdContext Kimlik Bilgisi

Mesaj gönderen vkamadan »

@SimaWB yardımların için teşekkür ederim , ilk verdiğiniz örnekte olduğu gibi kendi Context sınıfımı kullanınca amacıma ulaştım.

İyi çalışmalar dilerim.
Volkan KAMADAN
www.polisoft.com.tr
Cevapla