TIdContext Kimlik Bilgisi
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
TIdContext Kimlik Bilgisi
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.
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
www.polisoft.com.tr
Re: TIdContext Kimlik Bilgisi
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:
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
Re: TIdContext Kimlik Bilgisi
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.
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
www.polisoft.com.tr
Re: TIdContext Kimlik Bilgisi
Ş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
Re: TIdContext Kimlik Bilgisi
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
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ı?
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 ....
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
Re: TIdContext Kimlik Bilgisi
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
Re: TIdContext Kimlik Bilgisi
Evet o listeyi biliyorum fakat clientleri birbirinden IP harici ayırmak için kullanacağım CLientID vb bir değişken olsaydı harika olacaktı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)
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
Re: TIdContext Kimlik Bilgisi
İlk yazdığım cevaptaki gibi kendi context'inizi oluşturursanız kendi listeniz de otomatik oluşmuş olur.vkamadan yazdı:Evet o listeyi biliyorum fakat clientleri birbirinden IP harici ayırmak için kullanacağım CLientID vb bir değişken olsaydı harika olacaktı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)
There's no place like 127.0.0.1
Re: TIdContext Kimlik Bilgisi
@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.
İyi çalışmalar dilerim.
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr