
Server Client da hata Client bağlanıyor ama işlem yapılmıyor
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Yok saçma birşey sormadın. Ama sabırlı ol biraz yaw 
Edit1.Text bilgisi ile user bilgisi gönderdiğini nasıl anlayacak:
Bunun için kendi protokol komutlarını yazacaksın ve bunları işleyeceksin.
HTTP böyle çalışır mesela. HTTP'de GET /bilmemne.HTML komutu verdiğinde, client, server a der ki sende bilmemne.HTML dosyası var ise bana bunu göndersene.
veya POST bilmemne=bilmemne komutu ile der ki sana adı bilmemne olan ve değeri bilmemne olan bir değer gönderiyorum bunu işlesene.
mesela senin protokol şöyle olabilir. Client'ından server a "CHECK USER=CODERLORD/121212" komutu gönderdin diyelim. Bunu serverda işleyeceksin. = e kadar olan bölüm komut diyeceksin. Eğer bu CHECK USER ise demek ki kullanıcı şifresi kontrolu yapılıyor. Buna göre sonraki veri / a kadar kullanıcı adıdır, kalanı şifredir. Şeklinde bir mantıkla bunları ayıracaksın. Ben bu komutları atıyorum. Sen daha mantıklı şeyler kullan.
Örnek:
Client der ki: CHECK_USER CODERLORD
Server der ki: OK (veya bu kullanıcı bende yok demek için USER_ERROR
komutunu geri döndürür, burdan anlarsın ki bu kullanıcı VT'de yok)
Client der ki (OK komutu aldıysa eğer): USER_PASSWD 121212
Server der ki: eğer kullanıcının şifresi doğru ise (USER_ACCEPT), değilse (PASSWD_ERROR)
böyle süreer gider işte. Karşıya komut ile işlemi böyle yaptırırsın. Mesela MSN Messenger da benzer bir sistemle çalışır.

Edit1.Text bilgisi ile user bilgisi gönderdiğini nasıl anlayacak:
Bunun için kendi protokol komutlarını yazacaksın ve bunları işleyeceksin.
HTTP böyle çalışır mesela. HTTP'de GET /bilmemne.HTML komutu verdiğinde, client, server a der ki sende bilmemne.HTML dosyası var ise bana bunu göndersene.
veya POST bilmemne=bilmemne komutu ile der ki sana adı bilmemne olan ve değeri bilmemne olan bir değer gönderiyorum bunu işlesene.
mesela senin protokol şöyle olabilir. Client'ından server a "CHECK USER=CODERLORD/121212" komutu gönderdin diyelim. Bunu serverda işleyeceksin. = e kadar olan bölüm komut diyeceksin. Eğer bu CHECK USER ise demek ki kullanıcı şifresi kontrolu yapılıyor. Buna göre sonraki veri / a kadar kullanıcı adıdır, kalanı şifredir. Şeklinde bir mantıkla bunları ayıracaksın. Ben bu komutları atıyorum. Sen daha mantıklı şeyler kullan.
Örnek:
Client der ki: CHECK_USER CODERLORD
Server der ki: OK (veya bu kullanıcı bende yok demek için USER_ERROR
komutunu geri döndürür, burdan anlarsın ki bu kullanıcı VT'de yok)
Client der ki (OK komutu aldıysa eğer): USER_PASSWD 121212
Server der ki: eğer kullanıcının şifresi doğru ise (USER_ACCEPT), değilse (PASSWD_ERROR)
böyle süreer gider işte. Karşıya komut ile işlemi böyle yaptırırsın. Mesela MSN Messenger da benzer bir sistemle çalışır.
yani yanlış anlamadıysam parametre gönderir gibi birleşik bir şey gönderecem ve bu birleşik gönderdiğim mesajdan gönderdiğim usercheck parametrini ve edit1 deki şifreyi ayırıp diyecem ki user check ise ayırdığım şifre bölümünü alacam bakacam daha sonra çıkan sonuç örneği true ise client çalışacak ve örneğin anaform açacak yoksa yanlış falan diyecek yanlış mı anlamışım 

Birde kafama takılan çünkü bu projeye yeni başladığım için...ki indy de yeni kullandığım için herşey takılıyor tabi şimdi gelen mesajlar tamam geliyor falan ama timeout a düşerse ne olacak yani....Çakıldı kaldı diyelim...Devamlı belli bir süre ile broadcasting mi yapmamız gerekecek şu makine var mı hala var mı diye eğer yok olursa ve hala bağlantısı aktif gözüküyorsa disconnect mi etmemiz gerekecek clienttaki şahsı....O kadar çok soru var ki kafamda...Aman Allahım..ne yapacam bilmiyorum... 

Merhaba...
- Protokol; senin de anladığını gördüğüm, bilgisayarların karşılıklı olarak kendi aralarında gidip gelen text'e anlam verip bazısını komut bazısını da yazılı mesaj olarak nasıl değerlendireceğini yine senin tarafından belirlenmesidir.
- Bence projene başlamadan biri Server diğeri Client olmak üzere iki farklı proje hazırla. Basit bir Chat programı olsun. Sonra bunu projene uygulayarak tek çatı altında buluşturursun.
- Önce bir Sunucu (Server) tasarlayacaksın. Bu server, senin de söylediğin gibi gelen giden mesajları inceleyecek kodlarla donatılacaktır. Yani bir nevi ışıklı kavşakta bulunan Trafik Polisi
TServerSocket bileşeni kullanacak.
- Client programlar ise Server'a bağlanacak ve mesaj alıp gönderecekler... Özetle tüm Client'ler sadece ve sadece Server'a mesaj gönderecek ve sadece Server'dan mesaj alacaklar.
Birbirlerine bağlanmak için her makinenin aynı zamanda birer server olması gerekir.
- Protokol diye bahsettiğimiz şeyi @coderlord çok güzel örneklemiş.
En basit şekliyle aşağıdaki gibi olduğunu varsayarsak;
- Server'a gelen bu mesaja şu anlamı yükledim: 10.0.0.6 numaralı IP'li Client, 10.0.0.3 numaralı IP'li Client'e Merhaba mesajını gönderilsin istemiş.
- Server bu mesajı alır almaz, kendisine halen bağlı olan Client'lerin IP listesinde Alıcı IP varsa aynı mesajı alıcı IP'li Client'e gönderecek veya listede yoksa (bağlantısını kesmişse) geriye Gönderen'e dönük "mesaj iletilemedi" şeklinde bir text gönderecek. Bu da şu şekilde olsun.
- Burada da mesajın gönderen IP kısmına adres yerine SERVER yazıldığında; Client, özel bir durum olduğunu anlayarak bu dönen mesajı program bazında değerlendirip gereği varsa o Client'in sahibi kullanıcıya yansıtacaktır.
- Bu ve benzeri şekilde programların birbiriyle nasıl anlaşacağını kağıt üzerinde hazırladıktan sonra gerisi kodlamaya kalıyor.
- Şimdi özetlersek bu Server'in görevleri ; (event event yazıyorum)
1. Kendisine bağlanan Client (istemci) programın IP'sini bir listede tutacak.
2. Bağlantısını sonlandıran Client'in IP'sini listeden silecek.
3. bir Client'den gelen mesajı alıp değerlendirecek.
- Bu değerlendirmede (protokol) Gönderenden gelen istek Alıcı bir diğer Client'i mi yoksa Server'i mi ilgilendiriyora bakılıp programın tepkisinin belirlenmesi sağlanacak.
- Umarım açıklayıcı olmuştur...
- Şimdi bu tip işlemler için lazım olacağını değerlendirdiğim bir fonksiyon olan, HostToIP fonksiyonunu vereyim.
- Bu fonksiyonun iki işlevi var. Dönüşü Boolean olduğundan sorgunun başarılı sonuçlanıp sonuçlanmadığının yanı sıra verdiğin HOST adına karşılık IP'sinin ne olduğunu döndürür.
Kullanımı:
// server için TServerSocket
// client için TClientSocket
// LocalHost yani programın bulunduğu makinenin IP'sini gösterir.
// örnekte ServerSocket1
Fonksiyon:
- Buraya kadar anlaşılmışsa ve hangi bileşen paketini kullanacağına karar verdiğinde ona göre anlatmata devam edilebilir...
- Kolay gelsin...
- TServerSocket ve TClientSocket'i kodunda nasıl kullandığını bilmiyorum. @P206'nın verdiği örneği mi denedin ve hata verdi ? Ben bir sorun göremedim. Şahsi tavsiyem (Indy'i kötülemiyorum) Internet bileşenleri oldukça sade ve etkin olduğundan bunları tercih etmek yönünde. Henüz bunlardan dolayı kilitlenen makine görmedim...Tserverkocket zaten kurdum....indy veya tserversocket ile bi çalışma yapmaya karar verdim ve dedim ki ilk başta indy ile başlayım kitap felanda aldım içinde indy anlatan bismillah şu kitaptaki örnek nasıl çalışıyor bakalım dedik...bu hata geldi aynısını tserversocket ile denedim yine hata verdi....mrmcop......

- Protokol; senin de anladığını gördüğüm, bilgisayarların karşılıklı olarak kendi aralarında gidip gelen text'e anlam verip bazısını komut bazısını da yazılı mesaj olarak nasıl değerlendireceğini yine senin tarafından belirlenmesidir.
- Bence projene başlamadan biri Server diğeri Client olmak üzere iki farklı proje hazırla. Basit bir Chat programı olsun. Sonra bunu projene uygulayarak tek çatı altında buluşturursun.
- Önce bir Sunucu (Server) tasarlayacaksın. Bu server, senin de söylediğin gibi gelen giden mesajları inceleyecek kodlarla donatılacaktır. Yani bir nevi ışıklı kavşakta bulunan Trafik Polisi

- Client programlar ise Server'a bağlanacak ve mesaj alıp gönderecekler... Özetle tüm Client'ler sadece ve sadece Server'a mesaj gönderecek ve sadece Server'dan mesaj alacaklar.

- Protokol diye bahsettiğimiz şeyi @coderlord çok güzel örneklemiş.

Kod: Tümünü seç
10.0.0.6>10.0.0.3|Merhaba
- Server bu mesajı alır almaz, kendisine halen bağlı olan Client'lerin IP listesinde Alıcı IP varsa aynı mesajı alıcı IP'li Client'e gönderecek veya listede yoksa (bağlantısını kesmişse) geriye Gönderen'e dönük "mesaj iletilemedi" şeklinde bir text gönderecek. Bu da şu şekilde olsun.
Kod: Tümünü seç
SERVER>10.0.0.6|Mesaj İletilemedi
- Bu ve benzeri şekilde programların birbiriyle nasıl anlaşacağını kağıt üzerinde hazırladıktan sonra gerisi kodlamaya kalıyor.
- Şimdi özetlersek bu Server'in görevleri ; (event event yazıyorum)
1. Kendisine bağlanan Client (istemci) programın IP'sini bir listede tutacak.
2. Bağlantısını sonlandıran Client'in IP'sini listeden silecek.
3. bir Client'den gelen mesajı alıp değerlendirecek.
- Bu değerlendirmede (protokol) Gönderenden gelen istek Alıcı bir diğer Client'i mi yoksa Server'i mi ilgilendiriyora bakılıp programın tepkisinin belirlenmesi sağlanacak.
- Umarım açıklayıcı olmuştur...
- Şimdi bu tip işlemler için lazım olacağını değerlendirdiğim bir fonksiyon olan, HostToIP fonksiyonunu vereyim.
- Bu fonksiyonun iki işlevi var. Dönüşü Boolean olduğundan sorgunun başarılı sonuçlanıp sonuçlanmadığının yanı sıra verdiğin HOST adına karşılık IP'sinin ne olduğunu döndürür.
Kullanımı:
// server için TServerSocket
// client için TClientSocket
// LocalHost yani programın bulunduğu makinenin IP'sini gösterir.
// örnekte ServerSocket1
Kod: Tümünü seç
var
IP:String;
begin
If HostToIpAddr( ServerSocket1.Socket.LocalHost, IP )
then ShowMessage('IP=' + IP)
else ShowMessage('IP öğrenilemedi');
end;
Kod: Tümünü seç
function HostToIPAddr(Name: string; var Ip: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
WSAStartup ($0101, wsdata);
try
gethostname (hostName, sizeof (hostName));
StrPCopy(hostName, Name);
hostEnt := gethostbyname (hostName);
if Assigned (hostEnt) then
if Assigned (hostEnt^.h_addr_list) then begin
addr := hostEnt^.h_addr_list^;
if Assigned (addr) then begin
IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
Result := True;
end
else
Result := False;
end
else
Result := False
else begin
Result := False;
end;
finally
WSACleanup;
end
end;
- Kolay gelsin...

selam
bu mesajların üzerinden koca bir sene geçmiş,birilerinin sene öncesinde kalan süreçlerini birileri sene sonralarında yakalayabiliyor ancak.sanırım buna deneyim deniyor....
saded:=
Ama hiçbirinde kırılma noktası oluşmadı.. ama Client ve serverda veri giriş çıkışı var..
birşeyleri yanlış mı yapıyorum anlayamadım.
bu mesajların üzerinden koca bir sene geçmiş,birilerinin sene öncesinde kalan süreçlerini birileri sene sonralarında yakalayabiliyor ancak.sanırım buna deneyim deniyor....
saded:=
indy bileşeninin OnWork,OnWorkEnd,OnWorkBegin olaylarına bug attım.coderlord Tarih: Pts Şub 21, 2005 10:16 Mesaj konusu:
--------------------------------------------------------------------------------
OnWork eventi olacak eve gelince baktım.
AWorkMode wmRead ise okuyor ( yani sana bilgi geliyor) wmWrite ise sen karşıya bilgi gönderiyorsun. Bunu kontrol edeceksin.
if AWorkMode = wmRead then
IdTCPClient1.ReadLn;
Ama hiçbirinde kırılma noktası oluşmadı.. ama Client ve serverda veri giriş çıkışı var..
birşeyleri yanlış mı yapıyorum anlayamadım.
balıkçıdan balık isteme, balık tutmayı öğretmesini iste....
kutal demiş ki:
idtcpclient.BeginWork(wmread)------> okuma olayını başlat
idtcpclient.BeginWork(wmwrite)------> yazma olayını başlat
sonrada işlemlerini yap.
saygılar.
tabiki çalışmaz kardeşim, bu olayları başlatan bir komut satırı var onu yazmak lazım..indy bileşeninin OnWork,OnWorkEnd,OnWorkBegin olaylarına bug attım.
Ama hiçbirinde kırılma noktası oluşmadı.. ama Client ve serverda veri giriş çıkışı var..
birşeyleri yanlış mı yapıyorum anlayamadım.
idtcpclient.BeginWork(wmread)------> okuma olayını başlat
idtcpclient.BeginWork(wmwrite)------> yazma olayını başlat
sonrada işlemlerini yap.
saygılar.
balıkçıdan balık isteme, balık tutmayı öğretmesini iste....