Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Client-Server Application (Msn gibi) [Java]


SpiderS_DangeR

Öne çıkan mesajlar

Clientlar arası mesajlaşma yapmaya çalışıyorum. Client sunucuya mesajla birlikte mesajın yollanmasını istediği clientın soket bilgilerini(port vs) yollayacak, sunucuda
PrintWriter out = new PrintWriter(new OutputStreamWriter(soket.getOutputStream()),true); burada ki soket yerine öbür mesajın yollanması istenen clientın soketini kullanacak böylece out.println() methoduyla istenen clienta mesaj yollanmış olacak. Açıklayabildim mi bilmiyorum, çok absürd bir yol da olabilir ama amatörlüğüme verin sdf
Link to comment
Sosyal ağlarda paylaş

Ben anlamadım da kodu yazmaya oturmadan önce bağlantıların nasıl olacağını anlatan bir iki diagram çizsen faydalı olur. Ne yapmak istediğini sözel olarak başkasına anlatmak çok zor.

Bakınız:
http://www.sonnyradio.com/what-the-customer-actually-wanted.jpg

Mesela mesajları sunucu mu dağıtacak? Sunucu sadece peer-to-peer bağlantı kurmayı mı sağlayacak? Bağlantı kurarken hangi mesajlar yollanacak bunları belirlemen lazım önce.
Link to comment
Sosyal ağlarda paylaş

Kusura bakmayın biraz sıkıntı yaşıyorum derdimi anlatırken. Mesajları server clienttan gelen bilgiye göre dağıtacak. Atıyorum
/mesajyolla/1324/naber yazınca client, sunucu bunu parse edecek ondan sonra 1324 portuyla iletişim kuran threadde bulunan soketi kullanarak out.println() metoduyla mesajı gerekli clienta yollayacak. Yani clientlar arasında hiçbir bağlantı olmayacak. Yine mi olmadı?

Yani bağlantılar zaten kurulmuş, bütün clientlar server'a bağlı, ama hepsi farklı socketlerden bağlı çünkü hepsi farklı thread ile çalışıyor. Amacım A threadindeki socketi B threadinde kullanıp tekrar socket oluşturmadan iki client arasında mesajlaşma sağlamak.
Link to comment
Sosyal ağlarda paylaş

Peki anladım.

İlk başta kullandığın yapıyı gözden geçir, her socket e bir thread sana sorun çıkarır.

Socket = client = thread sayısı, 3000 client ın var ken 3000 thread çalışması server side, olmaz. Kaynakları boşa harcıyor olacaksın. Neyse şimdilik bu kalsın.

Server da bir tane Listener thread imiz olsun, bu adam gelen incoming client request lerini handle etsin. Eğer large scale de iş yapıyorsak, Listener sayısını arttırıp farklı port lardan listen edip, client side da 'n' portundan timeout alan client in bir sonraki 'n+1' den connection denemesi için policy yazarız veyahut singleton listener üzerinden queing yaparız (Şimdi yap diye yazmıyorum sadece olası scaling senaryoları bunlar)

Listener ın socket i pass ladıgı bir SocketHandler diye bir adamımız olsun, bu adam socket i ya bir ID generate etsin yada user ları tuttuğun bir yer var ise, gelen user in ismine göre bir variation ile array list ler halinde yada daha kolay bir map içine koyup aklında tutsun. Tabii burda delayed iş yapmak gerekecek çünkü gelen connection isteğini kabul ettiğimiz, kullanıcının mesaj alıp vermesine imkan verdiğimiz anlamına gelmemeli, daha ne adını aldık ne password istedik dimi.

Bu noktadan sonra socket üzerinden client server konusup handshake yapacaklar, user pass bilgisi gelecek, auth. olan client ları ya baska bir safe list e alacağız yada başka bir yöntemle o adamın ilgili flag ini set edeceğiz, bu adam alıp vermeye hazırdır şeklinde.

Geldik senin sorunun esas kısmına. A ve B adında iki adamımız birbirlerine mesaj gönderirken, A sockete basacağı string i formatted şekilde basacak, yani;

A, 'paticik ftw' yazdığı anda client side da string, 'dest-user=B;message=paticik ftw' gibi.

Elimizde dest var orig var, mesaj var. Parse edip server side da Map e koydugumuz ilgili adamlar arasında iterate edip mesajı ilgili sockete basacağız. Iteration i en güzel şekilde yapmak adına farklı distile map ler tutabiliriz ama bu da kalsın şimdilik.

Yazdıklarım ne en basit nede en effective çözüm, istediğin gibi yorumla, implementation i istediğin gibi değiştir.

En güzel, en verimli ve eğlenceli dönemleri yaşıyorsun, tadını çıkar.

Kolay gelsin.
Link to comment
Sosyal ağlarda paylaş

SpiderS_DangeR said:
Atıyorum
/mesajyolla/1324/naber yazınca client, sunucu bunu parse edecek ondan sonra 1324 portuyla iletişim kuran threadde bulunan soketi kullanarak out.println() metoduyla mesajı gerekli clienta yollayacak.


Client mesaj yollayacağı kişinin port numarasını nerden bilecek ki?

Sunucuda client isimlerini (ya da ID'lerini her neyse) socket'lere eşleştirecek singleton bir map tutabilirsin. Client sunucuya bağlantı kurduğunda bu map içine şeklinde bir ikili eklersin, bağlantı kesildiğinde silersin. Sonra sunucuda X client'ine bir mesaj yöneltmen gerektiğinde bu map'i kullanarak socket'i bulup kullanırsın.

Map interface'ine ve HashMap class'ına bak API'den. Hatta multithread ortamında olduğun için ConcurrentHashMap.

Bir thread içinden başka bir thread'e referans vermeye kalkmışma hiç bence. Boşuna karıştırırsın işleri.
Link to comment
Sosyal ağlarda paylaş

  • 2 hafta sonra ...
ucunbiri said:

bu arada şeyi sorcam, neden bütün clientlar farklı porttan bağlanıyor ki?

sabit yap hepsi aynı porttan bağlansın değişen sadece IPler olsun, öyle yapmıştım ben.

hem MSNde falan da böyle.


abi şimdi ben kendi bilgisayarımda uğraşıyorum ya, o yüzden ip ler aynı socketler farklı doğal olarak sfdg
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...