Server Client da hata Client bağlanıyor ama işlem yapılmıyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

s.a. Arkadaşlar çok mu saçma bir soru sordum galiba..Lütfen saçma ise söyleyin yoksa ben yanlış mı düşünüyorum...Lütfen yardımlarınızı bekliyorum... :(
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

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.
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

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 :)
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

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... :roll:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...
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......
- 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... :)

- 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 :idea: 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. :idea: Birbirlerine bağlanmak için her makinenin aynı zamanda birer server olması gerekir.

- Protokol diye bahsettiğimiz şeyi @coderlord çok güzel örneklemiş. :o En basit şekliyle aşağıdaki gibi olduğunu varsayarsak;

Kod: Tümünü seç

10.0.0.6>10.0.0.3|Merhaba
- 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.

Kod: Tümünü seç

SERVER>10.0.0.6|Mesaj İletilemedi
- 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

Kod: Tümünü seç

var 
  IP:String;
begin
  If HostToIpAddr( ServerSocket1.Socket.LocalHost, IP ) 
    then ShowMessage('IP=' + IP)
    else ShowMessage('IP öğrenilemedi');
end;
Fonksiyon:

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;
- Buraya kadar anlaşılmışsa ve hangi bileşen paketini kullanacağına karar verdiğinde ona göre anlatmata devam edilebilir...

- Kolay gelsin... :)
Resim
Resim ....Resim
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Indy'de timeout sorunu için çözümler mevcut. ReadLn'ı bazı özel parametreler ile kullanarak veya Waitfor gibi func. ları kullanarak bu probleme çözüm getirebilirsin. Dediğim gibi indy ile uğraşmayalı çok oldu. Herşey ezberimde değil. :)
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

Socketle yapmaya karar verdim bu indy ile heralde ufak tefek şöyle can alıcı yazılımlar yapmak lazım...Server Client pek uymuyor gibi sanki...@mrmcop ve @coderlord teşekkür ederim cevaplarınız, ilginiz ve alakanız için.....ikinizdende Allah razı olsun....

Teşekkürleri bir borç bilirim...
kutal
Üye
Mesajlar: 48
Kayıt: 14 Kas 2005 10:48

Mesaj gönderen kutal »

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:=
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;


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.
balıkçıdan balık isteme, balık tutmayı öğretmesini iste....
kutal
Üye
Mesajlar: 48
Kayıt: 14 Kas 2005 10:48

Mesaj gönderen kutal »

kutal demiş ki:
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.
tabiki çalışmaz kardeşim, bu olayları başlatan bir komut satırı var onu yazmak lazı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....
Lee
Üye
Mesajlar: 1
Kayıt: 19 Eki 2006 05:50

Lee

Mesaj gönderen Lee »

Ya kardeş ben resim yapıyorumda senin avatarındaki resmin büyük halini arıyodum aylardır.tesadüfen rastladım..
acaba avatarındaki o kız çocugun kalbini sökmüş giderkenki halini gönderebilirsen çok sevinirim ama resmin buyuk hali olcak...
Cevapla