Gönderen Konu: C# : Sunucuya gönderme hadisesi  (Okunma sayısı 5499 defa)  Share 

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı MsS9

  • İlk Adım
  • *
  • İleti: 6
  • Toplam: 0
C# : Sunucuya gönderme hadisesi
« : 01 Temmuz 2011, 13:04:49 »
sunucuya bir veri gönderecem örneğin;
'M'
'U'
'R'
'A'
'T'

bazen sunucuda lag(geç cevap) verdiğinden dolayı murat mesajını gönderemiyorum,

fakat sunuya tekrardan başka bir mesaj gönderdiğimde örn,
'A'
'L'
'İ'

bunun birleşmesini istiyorum:
'M'
'U'
'R'
'A'
'T'
'A'
'L'
'İ'

yani lag sebebiyle gönderilememiş olan mesajı bir sonraki mesaj ile birleştirmek istiyorum...

tcplistener sınıfını kullanıyorum, şimdiden tşk.

Çevrimdışı WhiteScars

  • Genel Yönetici
  • Usta
  • *****
  • İleti: 1047
  • Toplam: 143
  • (,^^)
Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #1 : 02 Temmuz 2011, 08:35:35 »
Sunucuya gönderdiğin mesajların sunucuya iletilip, iletilmemesi hakkında client'e veri dönebilirsin madem lag sorunun var. Örneğin "MURAT" gönderdikten sonra sunucu bunu alıp, kendi buffer'ına kaydettiği zaman client'a mesajı aldım diyebilir. Sonra client'ın "ALI" yazısını göndermesini sağlayabilirsin.

C# ta soket programlama yapmadım fakat, mantığı bir çok programlama dilinde aynıdır. Aldığın nesneleri birleştirmek istiyorsan, Önce bir buffer'ın olması lazım. Sunucu soketten okuğu veriye bu buffer'a yazar. Senin buffer dışında da aldığın verileri saklayabileceğin başka bir değişkeninde olması lazım. Seneryo şöyle olabilir;

- Client "MURAT" yazısını sunucuya gönderir
- Sunucu MURAT yazısını alınca buffer'a kaydeder.
- Sunucu MURAT yazısını alıp, başka bir değişkene atar. Değişen X olsun.
- Sunucu MURAT yazısını aldığını client'e bildirir.
- Client "ALI" yazısını gönderir
- Sunucu "ALI" yazısını alınca buffer'a kaydeder.
- Sunucu "ALI" yazısını alınca buffer'dan bu yazıyı alıp, X'in sonuna ekler.
- Sunucu "ALI" yazısınını aldığını client'e bildirir.
İnsanoğluna bırakabileceğiniz en güzel miras tecrübelerinizdir...

Çevrimdışı MsS9

  • İlk Adım
  • *
  • İleti: 6
  • Toplam: 0
Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #2 : 02 Temmuz 2011, 10:52:02 »
sorunda orda işte sunucu o tür bi geri dönüş yapmıyor, ama diğer programlar bunu yapabiliyor.

Çevrimdışı WhiteScars

  • Genel Yönetici
  • Usta
  • *****
  • İleti: 1047
  • Toplam: 143
  • (,^^)
Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #3 : 03 Temmuz 2011, 16:27:11 »
Kullandığın soket tipi nasıl blocking / non-blocking ?
İnsanoğluna bırakabileceğiniz en güzel miras tecrübelerinizdir...

Çevrimdışı MsS9

  • İlk Adım
  • *
  • İleti: 6
  • Toplam: 0
Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #4 : 04 Temmuz 2011, 15:11:21 »
blocking

Çevrimdışı WhiteScars

  • Genel Yönetici
  • Usta
  • *****
  • İleti: 1047
  • Toplam: 143
  • (,^^)
Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #5 : 04 Temmuz 2011, 20:55:30 »
tmm yukardaki flow blocking soket ile yapılabilir. Nedir yapamadığın yada çalışmayan kısım?
İnsanoğluna bırakabileceğiniz en güzel miras tecrübelerinizdir...

Çevrimdışı MsS9

  • İlk Adım
  • *
  • İleti: 6
  • Toplam: 0
Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #6 : 04 Temmuz 2011, 23:34:31 »
Şöyle test ettim;

Serveri açıyorum clientten veri gelmesini bekliyor.
client veriyi gönderiyor serverda alıyor buraya kadar iyi

sonra biryere breakpoint koyarak sunucuyu meşgul hale getiriyorum
sunucu meşgul iken
clientten ardarda mesaj yolluyorum
sunucudaki breakpointi kaldırarak clientten gelen mesajın alınmasını sağlıyorum
fakat clientten gelen mesaj ardarda gönderdiğim mesajların sonuncusunu elde edibiliyorum
« Son Düzenleme: 04 Temmuz 2011, 23:40:04 Gönderen: MsS9 »

Çevrimdışı MsS9

  • İlk Adım
  • *
  • İleti: 6
  • Toplam: 0
C# : Sunucuya gönderme hadisesi
« Yanıtla #7 : 04 Temmuz 2011, 23:38:58 »
testin projesi VS 2008:
http://www.2shared.com/file/wzUH-Fu_/testsw.html

Çevrimdışı WhiteScars

  • Genel Yönetici
  • Usta
  • *****
  • İleti: 1047
  • Toplam: 143
  • (,^^)
Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #8 : 05 Temmuz 2011, 14:06:10 »
You are not allowed to view links. Register or Login
Şöyle test ettim;

Serveri açıyorum clientten veri gelmesini bekliyor.
client veriyi gönderiyor serverda alıyor buraya kadar iyi

sonra biryere breakpoint koyarak sunucuyu meşgul hale getiriyorum
sunucu meşgul iken
clientten ardarda mesaj yolluyorum
sunucudaki breakpointi kaldırarak clientten gelen mesajın alınmasını sağlıyorum
fakat clientten gelen mesaj ardarda gönderdiğim mesajların sonuncusunu elde edibiliyorum

Şimdi Server'ı açtın client'ten veri gelmesini bekliyor. Client veri gönderiyor, server alıyor. Buraya kadarki kısımda yanlış bir şey yok.
Bundan sonra mantık hataları başlıyor.
Şimdi normalde break point'e ihtiyacın yok. Server soketten veri alasıya kadar zaten programın çalışmasını durdurur. Artı client'ten ard arda veri gönderiyorum demişsin. blocking soket tipinde ard arda veri göndermezsin. Blocklanır çünkü. Akış şu şekilde olması gerekiyor:

Server çalıştırırlır ve soket dinlemeye alınır. (Bu kısımda dediğim gibi break point'te ihtiyacın yok. Receive gibi bir function vardır. Bu function çalıştırıldığında execution durur. Client veri gönderir. Server soketten veriyi alır ve receive fonksiyonundan çıkıp geri kalan kodu çalıştırır. Bu geri kalan kodda senin soketten gelen veriyi alıp, başka bir yere kopyalama kodun olması lazım. Arkasından serverın client'te bir şeyler göndermesi gerekir. send method'u ile burda clientten veriyi aldığını veya alamadığını gönderirsin. Client zaten veriyi gönderdikten sonra receive'de bekliyor olması lazım. Sen server'dan veriyi gönderdiğinde client receive de olduğu için veriyi alacaktır. Sonra server'daki aynı mantık client içinde geçerli. Veriyi aldıktan sonra işleyip, devam ettirebilirsin bu şekilde döngüyü.

Kısaca mantığı özetliyim:

Server

1- Soket aç
2- Sonusuz loop'a sok
3- Sonsuz loop içinde receive fonksiyonunu çağır.
4- <Client veri gönderir>
5- Soket receive mod'tan çıkıp, kodun geri kalanını çalıştırır.
6- Soketten okuduğun veriyi başka bir ArrayList'e falan at.
7- Send method'u ile client'e veri alındı gibi bir mesaj gönder.
8- Sonsuz loop'ta olduğun için tekrar server receive moduna girecektir.


Client

1- Soketi aç
2- Sonsuz loop'a gir
3- Server'a send ile bağlantı MURAT yazısını gönder
4- Receive fonksiyonunu çağır.
5- Client bir şeyler receive ettiğinde kodun devamı çalışacaktır.
6- Gelen mesaj server tarafından verinin alındığını gösteren mesaj mı onu kontrol et. Eğer server veri alındı gnderdiyse geri kalan yazıyı gönder.

Böyle birşey aslında yazması kolay fakat, blocking soket mantığını yanlış anlamışsın. Bu anlattıklarımı kağıt üzerine çizip kodunu tekrar yazabilirsin. Bu arada gönderdiğin kod'a da vaktim olduğunda bakabilirim.
İnsanoğluna bırakabileceğiniz en güzel miras tecrübelerinizdir...

Çevrimdışı MsS9

  • İlk Adım
  • *
  • İleti: 6
  • Toplam: 0
Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #9 : 05 Temmuz 2011, 14:12:25 »
Sana çok teşekkür ediyorum bu konuyla ilgilendiğin için

Çevrimdışı WhiteScars

  • Genel Yönetici
  • Usta
  • *****
  • İleti: 1047
  • Toplam: 143
  • (,^^)
Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #10 : 06 Temmuz 2011, 07:59:18 »
Önemli değil. İşimiz :D

Önemli olan problemi çözdüğünde nasıl çözdüğünü burda da paylaşman böylelikle aynı derde sahip olan arkadaşlar bir şeyler öğrenebilir.
İnsanoğluna bırakabileceğiniz en güzel miras tecrübelerinizdir...

Bilişim Forum

Ynt: C# : Sunucuya gönderme hadisesi
« Yanıtla #10 : 06 Temmuz 2011, 07:59:18 »

 

İstediğiniz Sorudan Başlayabilirsiniz | Doktor a Sor