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

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

Mesaj gönderen delphist »

İndy bileşenleri ile server client bi yazılım yapmak istiyorum user kontrolünden işe başladım şu andaki yazacağım server programına telnet ile bağlandığım takdirde düzgün çalışıp gerekli msg vs. gönderiyor alıyor ve durumu memo1 yazıyorum fakat client tarafında şifre doğruysa anaform görünsün değilse disconnect şeklinde olan client programında tık yok kodlar aşağıda yardım ederseniz çok sevineceğim...Teşekkürler

Client Tarafı aşağıda Server var...

Kod: Tümünü seç

procedure Tlogin.FormCreate(Sender: TObject);
begin
cxTextEdit1.Clear;
cxTextEdit2.Clear;
IdTCPClient1.Host:='127.0.0.1';
IdTCPClient1.Port:=20000;
IdTCPClient1.Connect;
end;

procedure Tlogin.suiButton1Click(Sender: TObject);
var
oku:string;
begin
 oku:=IdTCPClient1.ReadLn;
 if oku='Kullanici adi:' then
  IdTCPClient1.WriteLn(cxTextEdit1.Text);
    oku:=IdTCPClient1.ReadLn;
 if oku='Sifre:' then
  IdTCPClient1.WriteLn(cxTextEdit2.Text);
    oku:=IdTCPClient1.ReadLn;
 if oku='Hata:' then
  begin
  showmessage(IdTCPClient1.ReadLn);
  IdTCPClient1.Disconnect;
  end
  else
  begin
  oku:=IdTCPClient1.ReadLn;
  if oku='Sifre Kabul Edildi' then
   begin
   anamenu.ShowModal;
   end
   else
   begin
   ShowMessage(oku);
   IdTCPClient1.Disconnect;
    end;
end;
end;

end.
Server

Kod: Tümünü seç

procedure TConnection.IdTCPServer1Connect(AThread: TIdPeerThread);
var
sifre:string;
begin
 suiMemo1.Lines.Add(AThread.Connection.Socket.Binding.PeerIP+' adresinden bağlantı isteği geldi');
 AThread.Connection.Write('Kullanici Adi:');
 kullanici:=AThread.connection.ReadLn;
  if dm.TBLKULLQ.Active=false then
   begin
  dm.TBLKULLQ.Active:=true;
   end;

  if dm.TBLKULLQ.Locate('username',kullanici,[]) then
   begin
   suiMemo1.Lines.Add(kullanici+' için şifre soruluyor');
   AThread.Connection.write('Sifre:');
   sifre:=AThread.Connection.ReadLn;
   suiMemo1.Lines.Add(kullanici+'kullanıcısı'+sifre+' ile sisteme girmeye çalışıyor');

    if Trim(dm.TBLKULLQ.Fieldbyname('password').AsString) = sifre then
     begin
     suiMemo1.Lines.Add(kullanici+' için şifre kabul edildi');
     AThread.Connection.WriteLn('Sifre Kabul Edildi');
     end
     else
     begin
      suiMemo1.Lines.Add(kullanici+' için şifre kabul edilmedi');
      AThread.Connection.WriteLn('Sifre Kabul Edilmedi');
      athread.Connection.Disconnect;
     end;

   end
   else
   begin
    AThread.Connection.WriteLn('Hata:');
    AThread.Connection.WriteLn('Kullanıcı Adı bulunamadı');
    suiMemo1.Lines.Add(kullanici+' sisteme giremedi');
    athread.Connection.Disconnect;
   end;
end;
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

deneme iki Bu sefer internet sekmesinte tcp bileşenleri peki sonuç mu yine aynı indy ile bir fark yok....

Kodlar aşağıda...Yardımlarınızı bekliyorum...

server

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
begin
TcpServer1.LocalPort:='20000';
TcpServer1.Active:=true;
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
kullanici:AnsiString;
sifre:AnsiString;
begin
memo1.Lines.Add(ClientSocket.RemoteHost+' adresinden bağlantı isteği geldi'); // ip no
ClientSocket.Sendln('Kullanici Adi:');
kullanici:=ClientSocket.Receiveln();

 if ADOQUERY1.Locate('username',kullanici,[]) then
   begin
   Memo1.Lines.Add(kullanici+' için şifre soruluyor');
   ClientSocket.Sendln('Sifre:');
   sifre:=ClientSocket.Receiveln();
   Memo1.Lines.Add(kullanici+'kullanıcısı'+sifre+' ile sisteme girmeye çalışıyor');
   if Trim(adoquery1.Fieldbyname('password').AsString) = sifre then
     begin
     Memo1.Lines.Add(kullanici+' için şifre kabul edildi');
     ClientSocket.Sendln('Sifre Kabul Edildi');
     end
     else
     begin
      Memo1.Lines.Add(kullanici+' için şifre kabul edilmedi');
      ClientSocket.Sendln('Sifre Kabul Edilmedi');
      ClientSocket.Disconnect;
     end;
     end
     else
     begin
     ClientSocket.Sendln('Hata:');
    ClientSocket.Sendln('Kullanıcı Adı bulunamadı');
    Memo1.Lines.Add(kullanici+' sisteme giremedi');
    ClientSocket.Disconnect;
     end;


end;

end.


Client



Kod: Tümünü seç

procedure TForm2.FormCreate(Sender: TObject);
begin
edit1.Clear;
edit2.Clear;
TcpClient1.RemoteHost:='127.0.0.1';
TcpClient1.RemotePort:='20000';
TcpClient1.Active:=true;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
oku:AnsiString;
begin
oku:=TcpClient1.Receiveln();
 if oku='Kullanici adi:' then
  TcpClient1.Sendln(edit1.Text);
  oku:=TcpClient1.Receiveln();
 if oku='Sifre:' then
  TcpClient1.Sendln(edit2.Text);
  oku:=TcpClient1.Receiveln();
 if oku='Hata:' then
  begin
  ShowMessage(TcpClient1.Receiveln);
  TcpClient1.Disconnect;
  end
  else
  begin
  oku:=TcpClient1.Receiveln();
  if oku='Sifre Kabul Edildi' then
   begin
   form3.showmodal;

   end
   else
   begin
   ShowMessage(oku);
   TcpClient1.Disconnect;
   end;
 end;

end;

end.
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

arkadaşlar bir sürü deneme yaptım ama sonuç aynı...:( bu konuda yardımlarınızı bekliyorum neden böle oluyor
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

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

Mesaj gönderen fduman »

delphist yazdı: procedure Tlogin.suiButton1Click(Sender: TObject);
var
oku:string;
begin
oku:=IdTCPClient1.ReadLn;
if oku='Kullanici adi:' then
IdTCPClient1.WriteLn(cxTextEdit1.Text);
oku:=IdTCPClient1.ReadLn;
if oku='Sifre:' then
IdTCPClient1.WriteLn(cxTextEdit2.Text);
oku:=IdTCPClient1.ReadLn;
if oku='Hata:' then
begin
[/code]
Indy ile çalışmayalı uzun zaman oldu. Fakat hatırladığım kadarıyla ReadLn senkron bir çağrı değildi. Yani veri gelene kadar beklemiyordu. Keza WriteLn'da öyle. Sonuçta senin kodda düğmeye basınca server'dan gelen yanıtı yakalayamadan click proceduru son buluyor.

Bunun için (tam hatırlamıyorum kusura bakma, hatırlayan arkadaşlar yardımcı olur) WaitFor gibi birşey vardı. Bunu koyunca server'dan gelen yanıtı bekliyor. Yanıt gelince bir alt satırdan devam ediyordu. Şimdi burada beklettiğinde program normal olarak donacak, bunun için IndyAntiFreeze koy formuna bir tane de.

Aslında en iyi yöntem Indy'nin event'lerini kullanmak. Eventinde (OnRead miydi o da?) bu kodları kullanmalısın. Yani client'a bilgi geldiğinde şunu şunu yap şeklinde. Butona da sadece server'a bağlantı kurup komutu yollayan kodu yazmalısın.
P206
Kıdemli Üye
Mesajlar: 395
Kayıt: 17 Haz 2003 12:36
Konum: İstanbul

Mesaj gönderen P206 »

Selam aşağıda ki kodu tek form üzerinde oluşturup deneme yaptım doğru çalışıyor.

İnternet sekmesinde ki bileşenleri kullandım.tüm Uniti gönderiyorum

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    ClientSocket1: TClientSocket;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
        ClientSocket1.Address:='127.0.0.1';
        ClientSocket1.Port:=2000;
        ClientSocket1.Active :=true;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
        ServerSocket1.Port:=2000;
        ServerSocket1.Active:=true;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
        Caption:='Connected'
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
s:string;
begin
        s:=ServerSocket1.Socket.Connections[0].ReceiveText ;
        if copy(s,1,5)='şifre' then s:= trim(copy(s,pos(':',s)+1,length(s)));
        if s='deneme' then ServerSocket1.Socket.Connections[0].SendText('sonuc:gir'); 
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
s:String;
begin
        s:=ClientSocket1.Socket.ReceiveText;
        if copy(s,1,5)='sonuc' then begin
                s:=trim(copy(s,pos(':',s)+1,length(s)));
                if s='gir' then Caption :='GİREBİLİRSİN' 
        end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
        ClientSocket1.Socket.SendText('şifre:'+Edit1.Text);
end;

end.
I love my car.
Blog Yaptık
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

çok teşekkür ederim yanıtın için inşallah eve gidince deneyeceğim bu arada idantifreeze bileşeninide kullandım ama onu kullandığım halde kilitlendi...Ama eventlarla ilgili çalışmadım bakacağım evde cevabın için çok teşekkür ederim...Allah razı olsun....
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

yanliz indy bileşenlerinin eventinda on read gibi bir event yok acaba bu eventin işini yapan başka bir event mi var arkadaşlar....
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Hatırlatma...

viewtopic.php?t=6796&highlight=internet

Daha önce yine senin sorduğun sorudur...

@P206'nın verdiği cevap için lazım olacak...

- Kolay gelsin... :o
Resim
Resim ....Resim
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

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......

Yani deniyorum ama tam olarak bi bilgim olmadığı için bir şey de yapamıyorum açıkçası ama bu kitlenme muhabbeti için idyantifreeze de kullandığım halde yine kitlendi... :( .....Teşekkür ederim.......
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

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;

gibi.. http://www.indyproject.org adresinde çok güzel demo'lar ve makaleler var. Önce bunlara göz atmanı öneriyorum. Bunları iyi anladıktan sonra programını yazmaya başla.
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

O zaman bende bu mesaja şöyle diyorum...Teşekkür ederim...Allah razı olsun... :) Sağolasın coderım lordum...@coderlord
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

Peki Server tarafından veri gönderildiği zaman on read vs. ile kontrol ediyoruz ama server tarafında onwork gibi bir event yok serverda böle bir sey yapmaya gerek kalmıyor mu yoksa orda başka bir eventla gelen mesajı yakalamak gerekecekmi arkadaşlar....Teşekkür ederim...

Bir de idtcpclient in iki tane daha eventi var onworkbegin ve onworkend diye bu eventleri ne için kullanabiliriz...Teşekkürler
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

server tarafında onexecute kullanıyorsun
AThread.Connection.ReadLn ile geleni okuyorsun

AThread bu evente parametre olarak gecen bir nesne
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

peki handle ile yapıldığı zaman handle oncommand eventinde öneğin kullanıcı şifrey pass yazdı gönderde dedi user diye handle ile yakaladık useroncommand da gerekli kontrolü yapıp işlemleri yapmak mı doğru olur ki şu an onu deniyorum biter bitmez cevap vereceğim yoksa sizin dediğiniz gibi onexecute da mı read etmeliyiz gelen veriyi...Teşekkür ederim..
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

İlk önce bana cevap veren tüm arkadaşlara teşekkür ederim...Handle da yakalama ve bunun ile ilgili örnekler buldum ama şöyle bir durum var.....

Örneğin time diye bir handle oluşturdum ve cilent tarafından time diyip gönderdiğim zaman server zamanı mesela clienta yazıyor ok bunda bir problem yok ve bunun gibi işlemlerde problem yok...

programın ilk girişinde user password girişi....user ve pass alanını doldurup giriş dedi bastı butona ilk önce yapacağımız şey user var mı onu bi kontrol etmek...user handle gönderdik server da Kullanici adi şeklinde tekrar write etti clienta ve clienttanda dedik ki gelen bilgi kullanici adi ise edit2 nin içindeki bilgiyi write ama server hangi handle ile geldiği nerden bilecek benim takıldığım yer burası arkadaşlar...Yani biton writeln readln olayı var ben user tarafından bir sey gönderdiğim zaman servera veya server tarafından bir sey gönderdiğim zaman bu olayı yapamıyorum...idtcpclient.writeln(edit1.text) dediğim zaman bir de server bu edit1in user ile alakalı olduğunu bilmesi lazım....Teşekkür ederim.....
Cevapla