Client-Server - Soru

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
yeni_delphi
Üye
Mesajlar: 6
Kayıt: 06 Eyl 2010 12:52

Client-Server - Soru

Mesaj gönderen yeni_delphi »

İyi günler;

Client ve Server olmak üzere iki ayrı proje oluşturdum.
Client üzerinde edit1 edit2 edit3 ve edit4 var. Bir buton ile bunların textlerini Server'a göndermek istiyorum.
Bunların Server'a gittiğinde de otomatik olarak label1 label2 label3 ve label4 e sırasıyla yerleşmelerini istiyorum.

Editlerin textlerini gönderirken sorun yaşamıyorum ama sadece bir label üzerinde yanyana çıkıyorlar. Nasıl yapacağımı çözemedim. Yardımcı olabilirseniz teşekkürler.

İyi çalışmalar

(ek düzenleme: server içerisinde client'teki edit1.text'i kod olarak nasıl gösterebilirim. yani ona direk olarak ulaşmam için nasıl bir kod gerekli, yani client(edit1.text) gibi..)
En son yeni_delphi tarafından 06 Eyl 2010 10:27 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
RamazanG
Üye
Mesajlar: 73
Kayıt: 16 Tem 2010 03:38

Re: Client-Server - Soru

Mesaj gönderen RamazanG »

mantığı anladıysan gerisi çocuk oyuncağı, port ve host vermeyi unutmayın!!!

Kod: Tümünü seç

  

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Clientsocket1: TClientSocket;
    StatusBar1: TStatusBar;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Button3: TButton;
    CheckBox1: TCheckBox;
    Checkbox2: TCheckBox;
    procedure Button1Click(Sender : TObject);
    procedure Button2Click(Sender : TObject);
    procedure Clientsocket1Error(Sender : TObject; Socket : TCustomWinSocket;
      ErrorEvent : TErrorEvent; var ErrorCode : integer);
    procedure Clientsocket1Disconnect(Sender : TObject;
      Socket : TCustomWinSocket);
    procedure Clientsocket1Connect(Sender : TObject;
      Socket : TCustomWinSocket);
    procedure Button3Click(Sender : TObject);
    procedure FormClose(Sender : TObject; var Action : TCloseAction);
    procedure FormDestroy(Sender : TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender : TObject);
begin
  Clientsocket1.Active := True;
end;

procedure TForm1.Button2Click(Sender : TObject);
begin
  Clientsocket1.Active := False;
end;

procedure TForm1.Clientsocket1Error(Sender : TObject;
  Socket : TCustomWinSocket; ErrorEvent : TErrorEvent;
  var ErrorCode : integer);
begin
  errorcode := 0;
  StatusBar1.SimpleText := 'Hata';
end;

procedure TForm1.Clientsocket1Disconnect(Sender : TObject;
  Socket : TCustomWinSocket);
begin
  StatusBar1.SimpleText := 'Bağlantı yok';
end;

procedure TForm1.Clientsocket1Connect(Sender : TObject;
  Socket : TCustomWinSocket);
begin
  StatusBar1.SimpleText := Clientsocket1.Address;
end;

procedure TForm1.Button3Click(Sender : TObject);
var
  Text : string;
begin

  if checkbox1.Checked = True then
  begin
    Text := 'gelen1';
    Clientsocket1.Socket.SendText(Text);
  end;
  if Checkbox2.Checked = True then
  begin
    Text := 'gelen2';
    Clientsocket1.Socket.SendText(Text);
  end;
end;

procedure TForm1.FormClose(Sender : TObject; var Action : TCloseAction);
begin
  Clientsocket1.Active := False;
end;

procedure TForm1.FormDestroy(Sender : TObject);
begin
  Clientsocket1.Active := False;
end;

end.


******************************************************************************************************

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Serversocket1: TServerSocket;
    procedure FormClose(Sender : TObject; var Action : TCloseAction);
    procedure FormDestroy(Sender : TObject);
    procedure FormCreate(Sender : TObject);
    procedure Serversocket1ClientError(Sender : TObject;
      Socket : TCustomWinSocket; ErrorEvent : TErrorEvent;
      var ErrorCode : integer);
    procedure Serversocket1ClientRead(Sender : TObject;
      Socket : TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender : TObject; var Action : TCloseAction);
begin
  Serversocket1.Active := False;
end;

procedure TForm1.FormDestroy(Sender : TObject);
begin
  Serversocket1.Active := False;
end;

procedure TForm1.FormCreate(Sender : TObject);
begin
  Serversocket1.Active := True;
end;

procedure TForm1.Serversocket1ClientError(Sender : TObject;
  Socket : TCustomWinSocket; ErrorEvent : TErrorEvent;
  var ErrorCode : integer);
begin
  errorcode := 0;
end;

procedure TForm1.Serversocket1ClientRead(Sender : TObject;
  Socket : TCustomWinSocket);
var
  Text : string;
begin

  Text := socket.ReceiveText;
  if Text = 'gelen1' then
  begin
    Label1.caption:='Deneme1';
    Serversocket1.Active := False;
    Form1.Close;
  end;
  if Text = 'gelen2' then
  begin
     Label2.caption:='Deneme2';
    Serversocket1.Active := False;
    Form1.Close;
  end;
end;


end.
yeni_delphi
Üye
Mesajlar: 6
Kayıt: 06 Eyl 2010 12:52

Re: Client-Server - Soru

Mesaj gönderen yeni_delphi »

Bir türlü uyarlayamadım kendi projeme,
Kodları kopyalayıp yeni projelerde çalıştığımda da server'da herhangi bir değişiklik gerçekleşmiyor.

Eğer kaydettiyseniz projeleriyle gönderebilir misiniz çalışır hâlde?

(var kısmında belirlenen değerleri kullanmayı da bilmiyorum bu arada, fazla bir delphi bilgim olduğu söylenemez, sadece basit mantığını biliyorum)
yeni_delphi
Üye
Mesajlar: 6
Kayıt: 06 Eyl 2010 12:52

Re: Client-Server - Soru

Mesaj gönderen yeni_delphi »

Aslında istediğim tam olarak şu. Farklı yollardan fazla detayına girince kafam karışıyor iyi bilmediğim için.

Client içerisinde 2 tane edit olacak, Server içerisinde de 2 tane label olacak.
Client içerisinden butona basınca edit1 Server'daki label1'de; edit2 de label2'de görünecek.

Benim yaptığım kadarıyla editlerin ikisi de aynı labelde görünüyor.
Veya sadece bir edit bir labelde görünüyor.
Ayrı ayrı işletmeyi yapamadım.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Client-Server - Soru

Mesaj gönderen unicorn64 »

serverin gelen mesajın hangi editten geldiğini bilmesi gerek...

mesajı göndermeden önce önüne hangi editten geldiğini bildirecek ufak bir düzenlemeyle istediğini elde edebilirsin... mesela mesajını editno|mesaj formatında gönderirsen, serverda gelen mesajın başından | işaretine kadar kısmı alır ( :ara pos, copy)
hangi editten geldiğini algılar asıl mesajı yani | işaretinden sonrasını uygun yere yazarsın...

edit: sadece 4 tane edit ve label olacaksa araya işaret koymana da gerek kalmaz mesajı EditNoMesaj şeklinde oluşturursun, serverda gelen mesajın ilk karakterini editno olarak alır işleme devam edersin...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
yeni_delphi
Üye
Mesajlar: 6
Kayıt: 06 Eyl 2010 12:52

Re: Client-Server - Soru

Mesaj gönderen yeni_delphi »

RamazanG yazdı:mantığı anladıysan gerisi çocuk oyuncağı, port ve host vermeyi unutmayın!!!
dediğiniz mantıkla yapmayı anladım, ama sanırım yapmak istediğim şeyi bu mantığa uydurmam için bundan farklı bir yol izlemem gerek.
çünkü;

client'ten gelen1 yazısı geldiğinde ve server bunu tanıdığında, server'daki label1.caption'da deneme1 yazıyor..

benim istediğim client'teki edit1.text server'daki label1.caption'da
ve client'teki edit2.text server'daki label2.caption'da görünecek.

yani şu yazdığım kodun çalışır hâlde olanı lazım :D bunu istediğim mantıkta yazdım ama böyle bir kod yok zannımca

label68.caption := socket.ReceiveText(label12.Caption) ;
label69.caption := socket.ReceiveText(label13.Caption) ;

(bu kod server'da yer alıyor, label68 ve 69 server'da, label12 ve 13 client'te... server'daki bu koda, client'teki label i nasıl yol olarak gösterebilirim ki)
yeni_delphi
Üye
Mesajlar: 6
Kayıt: 06 Eyl 2010 12:52

Re: Client-Server - Soru

Mesaj gönderen yeni_delphi »

unicorn64 yazdı:serverin gelen mesajın hangi editten geldiğini bilmesi gerek...

mesajı göndermeden önce önüne hangi editten geldiğini bildirecek ufak bir düzenlemeyle istediğini elde edebilirsin... mesela mesajını editno|mesaj formatında gönderirsen, serverda gelen mesajın başından | işaretine kadar kısmı alır ( :ara pos, copy)
hangi editten geldiğini algılar asıl mesajı yani | işaretinden sonrasını uygun yere yazarsın...

edit: sadece 4 tane edit ve label olacaksa araya işaret koymana da gerek kalmaz mesajı EditNoMesaj şeklinde oluşturursun, serverda gelen mesajın ilk karakterini editno olarak alır işleme devam edersin...
anlattığınız mantıkta pos özelliğini kullanarak yaptım, client'teki 4 ayrı edit, server'daki 4 ayrı label'de göründü. ama bunu asıl istediğim forma sokamıyorum. istediğim, mesela;)

Kod: Tümünü seç

client:
edit1 edit2 edit3 edit4
edit5 edit6 edit7 edit8

combobox1 button1

Kod: Tümünü seç

server:
label1 label2 label3 label4
label5 label6 label7 label8
combobox1 = 1 iken edit1,2,3,4 sırasıyla label1,2,3,4 e gidecek. ama eğer combobox = 2 ise edit5,6,7,8 sırasıyla label5,6,7,8 e gidecek.. bu mantıkla bir sürü 4 lü gruplar hâlinde edit ve labellerim olacak.

bu şekle bir türlü getiremedim
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Client-Server - Soru

Mesaj gönderen unicorn64 »

baştan ne istediğini tam olarak anlatsan daha iyi olurdu sanırım...

önceki mesajımda gönderdiğim yapı hala geçerli aslında


edit1 den alınıp label1 e yazılacak mesaj -> 1|edit1.text
edit2 den alınıp label2 ye yazılacak mesaj -> 2|edit2.text
edit3 den alınıp label3 e yazılacak mesaj -> 3|edit3.text
edit4 den alınıp label4 e yazılacak mesaj -> 4|edit4.text
edit5 den alınıp label5 e yazılacak mesaj -> 5|edit5.text
edit6 dan alınıp label6 ya yazılacak mesaj -> 6|edit6.text
...


combodan 2 seçiliyse edit5-edit8 arasını gönderirsin...

hatta bu editlerin sayısı bir sonraki mesajında artacaksa şimdiden cevap vermiş olayım...
gidecek mesaj yapısını işe yarar şekilde değiştirelim...


combo 1 ise mesaj -> 1|edit1.text|edit2.text|edit3.text|edit4.text
combo 2 ise mesaj -> 2|edit5.text|edit6.text|edit7.text|edit8.text
......


şeklinde gönderirsin, ama bu sefer pos yeterli olmayacak, uses a idGlobal i ekleyip Fetch komutunu kullanabilirsin...

Kod: Tümünü seç

uses idGlobal;


var
  yer:integer;
  deger:array [0..3] of string;
  gelendeger:string;
  i:integer;
begin
  gelendeger:='1|abc|def|ghi|jkl';
  
  yer:=strtoint(fetch(gelendeger,'|')); 

  for i:=0 to 3 do 
    deger[i]:=fetch(gelendeger);

  case yer of
      1:  
           label1.text:=deger[0]; //abc
           label2.text:=deger[1]; //def
           label3.text:=deger[2]; //ghi
           label4.text:=deger[3]; //jkl
     2:  
           label5.text:=deger[0];
           label6.text:=deger[1];
           label7.text:=deger[2];
           label8.text:=deger[3];

//.............
     end;
end;


kodlamada hata olabilir, kopyaladım yapıştırdım çalışmadı demezsin umarım... gerisi sana kalmış...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
yeni_delphi
Üye
Mesajlar: 6
Kayıt: 06 Eyl 2010 12:52

Re: Client-Server - Soru

Mesaj gönderen yeni_delphi »

unicorn64 yazdı:baştan ne istediğini tam olarak anlatsan daha iyi olurdu sanırım...

önceki mesajımda gönderdiğim yapı hala geçerli aslında


edit1 den alınıp label1 e yazılacak mesaj -> 1|edit1.text
edit2 den alınıp label2 ye yazılacak mesaj -> 2|edit2.text
edit3 den alınıp label3 e yazılacak mesaj -> 3|edit3.text
edit4 den alınıp label4 e yazılacak mesaj -> 4|edit4.text
edit5 den alınıp label5 e yazılacak mesaj -> 5|edit5.text
edit6 dan alınıp label6 ya yazılacak mesaj -> 6|edit6.text
...


combodan 2 seçiliyse edit5-edit8 arasını gönderirsin...

hatta bu editlerin sayısı bir sonraki mesajında artacaksa şimdiden cevap vermiş olayım...
gidecek mesaj yapısını işe yarar şekilde değiştirelim...


combo 1 ise mesaj -> 1|edit1.text|edit2.text|edit3.text|edit4.text
combo 2 ise mesaj -> 2|edit5.text|edit6.text|edit7.text|edit8.text
......


şeklinde gönderirsin, ama bu sefer pos yeterli olmayacak, uses a idGlobal i ekleyip Fetch komutunu kullanabilirsin...
.
sanırım delphi bilgimin yeterli olmaması sebebiyle bir türlü yapamadım ama çok teşekkürler yardımların için
çalışan bir proje bulmaya çalışıp uygulamalı olarak görmeyi deneyeceğim
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Client-Server - Soru

Mesaj gönderen unicorn64 »

amacın öğrenmek mi yoksa bir işle mi uğraşıyorsun?
öğrenmek ise, tabiri caizse emeklemeden koşmaya çalışıyorsun gibime geldi, bence önce eline bir kitap alıp temelden öğrensen daha iyi edersin... forumdan soru cevapla öğrenmek imkansız demiyorum ama zor, o anki problemi çözecek kadar öğrenirsin sadece...

bu arada son gönderdiğim mesajda nereyi anlamadın, neyi yapamadın, takıldığın yeri söylersen yardımcı olmaya çalışayım. istersen kodlarını yaz buraya üzerinden konuşalım...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Cevapla