Gönderen Konu: Java sohbet programı || JMuhabbet  (Okunma sayısı 13481 defa)

Çevrimdışı ysbilgin

  • Üye
  • İleti: 65
    • Profili Görüntüle
Java sohbet programı || JMuhabbet
« : 25 Şub 2010, 02:08:51 Prş »
Merhaba;
Öncelikle şunu belirteyim, bu foruma her girişimde tam anlamıyla "geek" ortamı hissediyorum nedense. Onun için sorumu buraya yazayım dedim :).

Java ile hobi amaçlı bir sohbet programı geliştirmeyi düşünüyorum. Yazılım geliştirme süreçlerine uygun olarak açık kaynaklı olarak geliştirilecek. http://code.google.com/p/jmuhabbet/  Can sıkıntısından diyebiliriz. Soket programlamayla ilgili deneyimim yok. http://www.devarticles.com/c/a/Java/Socket-Programming-in-Java/1/ gibi kaynakları inceledim biraz. Herber amcanın kitabı da var kaynak olarak. Başka kaynak önerirseniz incelemek isterim.

Programın işleyişi kafamda netleşti sayılır. UML analize geçmeden önce kafamdaki soru işaretlerini sizinle paylaşmak istedim.

Şimdi kullanıcı login olmak için servera bağlanacak. Diyelimki login oldu bir şekilde. Mesajlaşmalar doğrudan p2p yani client to client mi olmalı, yoksa server üzerinden mi olmalı? Bana p2p olması mantıklı geliyor. Client programını login olduğuna ikna ettikten sonra diğer client in bilgisini verebiliriz. Ama bu esnekliği kısıtlıyor. Örneğin her oturumu açık olanın ip bilgisini saklaması lazım programın v.s.

Biraz beyin fırtınası yapalım, ne dersiniz?

Çevrimdışı Ases

  • Admin
  • Üye
  • İleti: 594
    • Profili Görüntüle
    • Kişisel Sitem
Ynt: Java sohbet programı || JMuhabbet
« Yanıtla #1 : 25 Şub 2010, 10:17:23 Prş »
Öncelikle kaynaklar:
http://www.java2s.com/ Hoş bir site ama İngilizce.
Onun dışında google da aratmak için anahtar kelimeler Java, TCP, Socket, Echo Server, Client

Özellikle echo server örnekleri konuyu anlamaya daha da yardımcı oluyor. Bir chat programı için bilmen gereken diğer bir konuda Thread ler. Java Socketlerin yapısı gereği server socketini bağlantı yapılmadan oluşturup bekler konuma getirmen gerekiyor ancak bu durumda eğer thread kullanmıyorsan bütün program donuyor ve bağlantı için bekliyor. Bu sebeple bağlantıları farklı farklı threadlerde yapman daha yararlı olur.

Anladığım kadarıyla yapmak istediğin bir chat kanalından çok MSN, Yahoo Messenger, Pidgin gibi bir p2p chat programı. Sorduğun sor aslında üzerinde ince şekilde düşünülüp karar verilmesi gereken çok değişkenli bir soru. Performans açısından p2p bağlantı daha iyi görünüyor çünkü ileride bu programı yüzlerce kişinin konuştuğunu, her birinin bir biriyle ikili sohbet yaptığını düşünürsek. Sunucu üzerindeki yük inanılmaz fazla olacaktır. Her sohbet için gelen giden mesajları kabul etmek, ilgili yere yönlendirmek vs.

Ancak p2p içinde sunucudan gerekli bilgileri almak biraz sıkıntı olabilir. Hangi thread hangi kullanıcıya aitti vs. gibi erilerin dikkatli bir şekilde karıştırılmadan tutulması lazım. Bunu belki thread adını kişinin kullanıcı adı yaparak biraz da olsa çözebiliriz ancak ya aynı kullanıcı adından iki kişi bağlanırsa? Kullanıcı hangi kişiyle sohbet etmek istediğini seçtiğinde onu ilgili thread a yönlendirme işini yapabilirsek, daha sonrası çok da zor değil o threadin soketinden IP vb. bilgileri okutarak kullanıcıya gönderebilirsin.

İstemci tarafında da birden çok kişiyle konuşma işini yine çok soket kullanarak yapman gerekir. Bunu belki thread kullanmadan şu şekilde aşabiliriz. Her konuşma için açılan yeni pencere kendi socketini içerir. Böylece birbirinden tamamen bağımsız pencerelerimiz olur ve thread zorunluluğu ortadan kalkar. Ancak bu durumda bu pencereler yine de ana threadi beklemeye zorlar mı o konuda emin değilim. Belki de her pencereyi bir thread yapmak işin çözümü olur.

Aslında biraz daha basitten başlayarak ya doğrudan p2p bir program yazabilirsin ya da basit bir chat kanalı (IRC tarzı) deneme olarak. TCP/IP konusuna biraz ilgiliyim çünkü bugüne kadar okuldan alıp da zamanında yetiştiremediğim tek projem TCP/IP chat programı oldu. Ayrıca şu anda staj içinde TCP/IP kullanan bir kod geliştirmem gerekiyor. Şimdilik işin çevrimdışı kısmını yazıyorum . Yakında umarım network kısmına da gireceğim.

Afedersin biraz fazla uzun uzun yazdım. Kolay gelsin.
http://www.canbu.info - Benim blogum, benim fikirlerim, benim dünyam...
----------------------------------------------------------------------------
There is a crack in everything, that's where the light gets in.

Çevrimdışı ysbilgin

  • Üye
  • İleti: 65
    • Profili Görüntüle
Ynt: Java sohbet programı || JMuhabbet
« Yanıtla #2 : 25 Şub 2010, 11:49:23 Prş »
Öncelikle ilgin için teşekkür ederim.

Thread konusunda haklısın. Hiç bir durumda GUI yi yöneten Thread a yüklü işlem yaptırmamak lazım.

Evet bir chat kanalı değil, tam adıyla IM (Instant Messaging) programı.

Burada diğer bir nokta ise server-client arasında giriş, yetkilendirme(authorization) işlemleri TCP üzerinden, mesajlaşma ise UDP üzerinden olacak.

Bence de bu işin optimum yolu istemcileri yetkilendirdikten sonra mesajlaşmaların p2p olmasıdır. Her ne kadar işi zorlaştıracak da olsa diğer türlü sunucu bu yükün altından zor kalkar, ayrıca insanların bütün yazışmalarını serverdan geçirmek doğru bir şey değil bence.

Bir de şu geldi aklıma, bu programın bir şifreleme algoritması olmalı, mesajlar istemciden istemciye şifreli gitmeli. Bildiğim kadarıyla msn de böyle bir şey yok.

Benim burada kafama takılan nokta port meselesi. Network bilgisine sahibim ama bahsettiğim gibi hiç soket programlama yapmadım. Benim karşıya mesajı gönderebilmem için karşıdaki routerda port yönlendirme vs. yapılması gerekmez değil mi? Burayı anlamadım.

Zaten başta deneme olarak p2p yaptıracağım. Ama ana programın kodlamasına planlaığımız gibi başlamak istiyorum.

Bir de işin süreç kısmı var. Biraz araştırmam lazım sanırım açık kaynak yazılım geliştirme süreçlerini. Eğer sistemi otutturabilirsek yardımcı olmak isteyenlerle birlikte çalışabiliriz.

Çevrimdışı toXic

  • Üye
  • İleti: 41
  • Men Dakka Dukka..
    • Profili Görüntüle
Ynt: Java sohbet programı || JMuhabbet
« Yanıtla #3 : 25 Şub 2010, 13:55:06 Prş »
Merhaba.

Java ile  yapilan bir kaç chat programi vardi. Fakat icinde Bulunan IP Ve PORT Kısmı bir şekilde deşifre oluyor.  Sohbet Sunucusuna Bu Sekilde Doğrudan giriş sağlaniyor. Program Sahibleri Bunun icin bir önlem almamislar.

Şifrenin Çözülmemesi icin ne yapilabilir örneğin?
Men Dakka Dukka.

Çevrimdışı Ases

  • Admin
  • Üye
  • İleti: 594
    • Profili Görüntüle
    • Kişisel Sitem
Ynt: Java sohbet programı || JMuhabbet
« Yanıtla #4 : 25 Şub 2010, 16:38:17 Prş »
Sunucuya girişi TCP mesajları UDP yapmayı planladığını söylemişsin. Bence her ikisi de TCP olabilir.

Şifreleme algoritması derken gönderilen metni değiştirerek şifrelemek genelde kolay kırılan bir şifreleme yöntemi. Sezarın algoritması olarak geçen harfleri bir sonraki bir öncekiyle değiştirme metodu çok işlevsel değil. Daha sert algoritmalarda var RSA gibi ya da MD5 var. Ancak MD5 ile şifrelenen bir metnin geri dönüşü maalesef yok. Bu da programı işlevsiz hale getirir.

Port konusunda ben de emin değilim. Kendi kodlarımı localhostta denediğim işin port olarak ne yazarsam yazayım bağlanabiliyordum.

Eğer sistemi oturttuğunda vaktim olursa yardımcı olmak isterim ancak şimdiden söz verip de sonra yarı yolda bırakmak istemem bu sebeple kesin konuşamıyorum.
http://www.canbu.info - Benim blogum, benim fikirlerim, benim dünyam...
----------------------------------------------------------------------------
There is a crack in everything, that's where the light gets in.

Çevrimdışı kelebek

  • Admin
  • Üye
  • İleti: 772
    • Profili Görüntüle
    • it's me
Ynt: Java sohbet programı || JMuhabbet
« Yanıtla #5 : 28 Şub 2010, 19:28:06 Paz »
Mesajlar p2p mantığıyla gitmesi bana daha mantıklı geliyor. Ama sohbet edecek birilerini bulabilmek, arkadaş listesi, online arkadaşlar vs gibi konularda mutlaka bir servera ihtiyaç duyacaksın.

Mesajların UDP üzerinden gitmesinin sana pratikte bir faydası olmayacaktır, hatta paketlerin doğruluğu kontrol edilmediği için hatalı mesajlarla karşılaşma olasılığın var. Sohbet sırasında trafik çok yüksek olmadığı için TCP yeterince hızlı olacaktır.
internet canavarı:
P3 700Mhz, 128MB Sd Ram, Trio 3D, 200GB hdd, Debian GNU/Linux lenny/sid 7x24x365:)
http://blog.yollu.com

Çevrimdışı OmerFaruk

  • Üye
  • İleti: 17
    • Profili Görüntüle
    • omerfarukkelek
Ynt: Java sohbet programı || JMuhabbet
« Yanıtla #6 : 09 Mar 2010, 19:36:27 Sal »
Öncelikle projende başarılar Dilerim.Basit bir örnek yaptım belki azda olsa katkısı olur.

SERVER  CLASS ‘ı:

Kod: [Seç]
class server
{
          final static  int  serverPort = 1099;
            public static void main(String args[])
            {
                  try
                  {
                        ServerSocket  socket = new ServerSocket(serverPort);//Serverda PORT oluşturuluyor.
                        System.out.println("Client bekliyorr...");

                        Socket  clientSocket = socket.accept();//Server portuna gelen isteği kabul ediyor.
                        System.out.println("Client Bağlandı");
                        BufferedReader  giris   = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));//Server da veri girişi Kanalı açılıyor.
                        PrintWriter   cikis   = new PrintWriter(clientSocket.getOutputStream());//Server da veri çıkışı Kanalı açılıyor.
                        String gelen_msg = giris.readLine();//Klavyeden girileni okuyor ve String değişkene atıyor.
                        System.out.println("Mesaji Cliente Gönder >" + gelen_msg);
                        cikis.println(gelen_msg);//Server'un çıkış kanalına atıyor sonra da Client'ın giriş kanalına giriyor.
                      
                        cikis.close();//Çıkış kanalını kapatıyor.
                        giris.close();//Giriş kanalını kapatıyor.
                        clientSocket.close();//Client dan gelen kapılarını kapatıyor.
                        socket.close();//Soket'i kapatıyor.
                  }
                  catch (Exception e)
                  {
                        System.out.println("Hata : " + e.getMessage());//hata mesajı
                  }
            }
}
CLİENT CLASS’ı:
Kod: [Seç]
class client
{
      final static String    serverIPname = "127.0.0.1";  
      final static  int       serverPort   = 1099;

    public static void main(String args[])
    {
          try
          {
                Socket socket = new Socket(serverIPname,serverPort);// Bağlanılacak Server'un IP'si  ve Portu
                PrintStream  cikis   = new PrintStream(socket.getOutputStream(),true);// Client için Çıkış Kanalı oluşturuluyor.
                BufferedReader  giris   = new BufferedReader(new InputStreamReader(System.in));// Client için Giriş Kanalı oluşturuluyor.

                System.out.println("Server'a Bağlandı !!");
                System.out.println("Server'a Mesaj Gönder :\n");

                String line = giris.readLine();//Klavyeden girilen veriyi okuyor ve String değişkene atıyor.

                cikis.println(line);//Client'in çıkış kanalına atıyor sonra da Server'un giriş kanalına giriyor.

                String svr_gelen_msg = giris.readLine();//Server'dan gelen veri okunuyor ve değişkene atılıyor.
                
                System.out.println("Serverdan Yanıt >" + svr_gelen_msg);//ekrana basılıyor
                cikis.close();//Çıkış kanalını kapatıyor.
                giris.close();//Giriş kanalını kapatıyor.
                socket.close();//Soket'i kapatıyor.
           }
          catch (Throwable e)
          {
                System.out.println("Hata : " + e.getMessage());//hata mesajı
          }
    }
}


  Kolay Gelsin
İYİ ÇALIŞMALAR
« Son Düzenleme: 14 Mar 2010, 19:19:21 Paz Gönderen: kelebek »
Yalan dünyanın yalan işlerini yalandan yapıyoruz...

Çevrimdışı kelebek

  • Admin
  • Üye
  • İleti: 772
    • Profili Görüntüle
    • it's me
Ynt: Java sohbet programı || JMuhabbet
« Yanıtla #7 : 14 Mar 2010, 19:20:09 Paz »
Kodları code tagları arasında yazmaya dikkat edelim lütfen.
Bu kullanım forumu daha anlaşılır bir hale getirecektir.
internet canavarı:
P3 700Mhz, 128MB Sd Ram, Trio 3D, 200GB hdd, Debian GNU/Linux lenny/sid 7x24x365:)
http://blog.yollu.com

Çevrimdışı toXic

  • Üye
  • İleti: 41
  • Men Dakka Dukka..
    • Profili Görüntüle
Ynt: Java sohbet programı || JMuhabbet
« Yanıtla #8 : 17 Mar 2010, 12:14:30 Çrş »
Bu arada, jmIRC  programında, nick ne ise ident'ide o oluyor ident'i sabitleme hakkında bilgisi olan varmı acaba
Men Dakka Dukka.