ServerSocket ClientRead sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
sga
Üye
Mesajlar: 60
Kayıt: 08 Tem 2005 12:49

ServerSocket ClientRead sorunu

Mesaj gönderen sga »

merhaba
clientten koltuk listesi için butona basınca listenin serverdan clientteki listboxa gelmesi gerekiyor ama gelmiyor acaba nerede hata yapıyorum.yardımcı olabilirseniz çok sevinirim :cry:
clientteki butondaki kod

Kod: Tümünü seç

procedure TForm2.Button2Click(Sender: TObject);
begin
listbox1.items.clear;
memo1.lines.clear;
clientsocket1.socket.sendtext('koltuk listesi');
label1.caption:='koltuk listesi istendi';
end;
serverdaki read deki kod

Kod: Tümünü seç

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
s:string;
i,kn:integer;
begin
s:=socket.receivetext;
if copy(s,1,4)='msg:' then
label1.caption:=s;
if s='koltuk listesi' then
begin
label1.caption:='boş  koltuk listesi  gönderiliyor';
serversocket1.socket.connections[0].sendtext('liste başı');
exit;
for i:=0 to listbox1.items.count-1 do
begin
//if strtointdef(listbox1.items[i],0) >0 then
serversocket1.socket.connections[0].sendtext(inttostr(i+1)+#13#10);
end;
serversocket1.socket.connections[0].sendtext('liste sonu');
label1.caption:='boş  koltuk listesi  gönderildi';
end;
if copy(s,1,8)='satıldı:'  then
begin
kn:=strtoint(copy(s,9,length(s)-8));
listbox1.items[kn-1]:='satıldı'+inttostr(kn)+'kime:'+socket.remoteaddress;
label1.caption:=inttostr(kn)+'nolu koltuk'+socket.remoteaddress+'adresıne  satıldı';
end;
end;

sga
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Kod: Tümünü seç

if s='koltuk listesi' then
begin
label1.caption:='boş  koltuk listesi  gönderiliyor';
serversocket1.socket.connections[0].sendtext('liste başı');
exit; 
Burdaki exit'den dolayı olabilir.


Bir tavsiyem olacak; begin end aralarını iki boşluk bırakarak yazın.

Kod: Tümünü seç

If a=1 Then 
begin
  For i:=1 to 10 Do
  begin
    Label1.Caption:=inttostr(i);
  end;
end;
gibi...
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

ulu coder yazdı:
Bir tavsiyem olacak; begin end aralarını iki boşluk bırakarak yazın.

Kod: Tümünü seç

If a=1 Then 
begin
  For i:=1 to 10 Do
  begin
    Label1.Caption:=inttostr(i);
  end;
end;
gibi...
bi sınavda sırf böyle kodlama yazdığım için kod yanlış olmasına rağmen 20 puanlık sorudan 10 puan almıştım, çünkü sınıfta böyle blok halinde kod yazan sadece ben varmışım :)
Kullanıcı avatarı
sga
Üye
Mesajlar: 60
Kayıt: 08 Tem 2005 12:49

Mesaj gönderen sga »

yok o exitten kaynaklanmıyor :( ama neden bilmiyorum
sga
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Kardeş 2 sebep var.
1-ordaki exit nedeniyle For döngüsü işlemiyor.
2-exit'i kaldırsan da, client'den 'Devam et' mesajını beklemediğin için sorun çıkartabilir. Client-Socket bağlantısında (nedense) ard arda bi şey gönderirken 'devam et' gibi bir msj beklemelisin.

Bu projenin kodlarına bi bak istersen.
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

ulu coder'in dedikleri doğru. 2. madde doğru değil:) Socketlerde Read eventi, Buffer nil'den farklı olduğu zaman çalışır. Buffer'ın nilden farklı olması için de bufferın tamamının okunması gerekir. Aksi takdirde ne kadar veri gönderirsen gönder event tetiklenmeyecektir. ulu coder'in bahsettiği aslında bu. Ama bu senin karşılaştığın sorun değil.

Senin kodları temel alarak kodu çalışır hale getirdim. Eğer Client Socket'e de okuma yaptırırsan ve Exit satırını silecek olursan sorun çıkmayacaktır. Ama sana gelen veri ne kadar işini görür onu bilmiyorum, çünkü gelen text tek bir parça halinde. Senin onu parçalaman vs gerekiyor.

Bir de ufak tavsiye. Mümkün olduğu kadar indent (tab) kullan ve ulu coder'in dediği gibi Begin End bloklamasını örnekteki gibi yap. Ayrıca bileşenlere de görevlerine göre isim ver. Örneğin Button1 yerine btnGonder gibi. Bu hem kodlamanı hızlandıracak, hem de kodu okurken çok daha rahat edeceksin.

Bir de eğer projen çok acele değilse, ulu coder'in verdiği linke birşeyler yazdım. İlgini çekebilir. Senin yerinde olsam, orada yazan ipucunu kurcalar ve adam gibi bir protokol yazardım.

Kolay gelsin,
Bahadır Alkaç
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

ikincisinin yanlış olduğuna emin misiniz?
Basit bir while-do döngüsüyle dosyayı 2KB'lık parçalar halinde, 'Devam et' mesajını beklemeden ard arda göndersek, ver kayıplarına yol açmaz mıyız?
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Bu dediğin devam et mesajı ile ilgili değil, Buffer'da veri olması ve eventin tetiklenmesi ile ilgili.

Bu arada ne olursa olsun, socketler üzerinden veri göndermenin en güvenli yolu, Stream ve thread kullanmaktır.

Kolay gelsin,
Bahadır Alkaç
Cevapla