ucunbiri Mesaj tarihi: Nisan 4, 2010 Mesaj tarihi: Nisan 4, 2010 SpiderS_DangeR said: ucunbiri öm attım bakabilicek misin simdi gördüm ya kusura bakma iyi oldu uyardığın :) atıyorum şimdi cevap
SpiderS_DangeR Mesaj tarihi: Nisan 4, 2010 Konuyu açan Mesaj tarihi: Nisan 4, 2010 Takıldığım bir nokta var. Şimdi clientlardan gönderilen her bağlantı isteği için ayrı bir thread yaratılıyo ve bu threadler de ayrı soketlerden bağlanıyo. Ama ben mesela A threadinde oluşturulan soketi B threadinde kullanmak istiyorum. Bunun bir yolu var mı?
SpiderS_DangeR Mesaj tarihi: Nisan 4, 2010 Konuyu açan Mesaj tarihi: Nisan 4, 2010 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
Mirage Mesaj tarihi: Nisan 4, 2010 Mesaj tarihi: Nisan 4, 2010 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.
SpiderS_DangeR Mesaj tarihi: Nisan 4, 2010 Konuyu açan Mesaj tarihi: Nisan 4, 2010 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.
Gladmir Mesaj tarihi: Nisan 4, 2010 Mesaj tarihi: Nisan 4, 2010 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.
Mirage Mesaj tarihi: Nisan 4, 2010 Mesaj tarihi: Nisan 4, 2010 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.
SpiderS_DangeR Mesaj tarihi: Nisan 18, 2010 Konuyu açan Mesaj tarihi: Nisan 18, 2010 yok abi yapamıyorum, kafayı yicem
ucunbiri Mesaj tarihi: Nisan 21, 2010 Mesaj tarihi: Nisan 21, 2010 haha hadi yine iyisin egemen, bak okuldayım sana kod yollayacağım geldi aklıma. 1-2 saate atarım.
ucunbiri Mesaj tarihi: Nisan 21, 2010 Mesaj tarihi: Nisan 21, 2010 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.
nameless Mesaj tarihi: Nisan 21, 2010 Mesaj tarihi: Nisan 21, 2010 asenkron socket yok mu java'da callbackli falan?
SpiderS_DangeR Mesaj tarihi: Nisan 21, 2010 Konuyu açan Mesaj tarihi: Nisan 21, 2010 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
Öne çıkan mesajlar