İ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
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.
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;
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.
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.
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.
ç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....
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.......
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.
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
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..
İ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.....