Kas
26
2012

Java Socket Programlama

Java Socket Programlamaya geçmeden önce socket kavramına açıklık getirmek istiyorum. Socket dendiği  zaman  birçok kişinin zihninde canlanan bilgisayarlarımızın üzerinde bulunan somut bir donanımsal parça oluyor. Aslında socket; Bilgisayarların ağ üzerinden haberleşmesini sağlayan yapılardır. Tabi bunun için bazı adresler kullanmak zorundayız. Bunlardan ilki bilgisayarın IP adresi.

IP adresi yardımıyla hangi bilgisayarla haberleşeceğimizi belirleriz. Haberleşilecek bilgisayara ulaşıldığı zaman, bu bilgisayar üzerinde hangi programla iletişime geçeceğimizi belirtmemiz gerekiyor . İşte burada bilgisayarlarımızın portları devreye giriyor. Yani iki bilgisayar birbiriyle bu iki yapı vasıtasıyla haberleşir (IP adresi ve Port).  Socket ‘i açıklarken Port ve IP adresine nereden geldiniz diye sorabilirisiniz :) Socket de zaten belirttiğim bu iki kavramdan oluşuyor. Yani socket bilindiğinin aksine donanımsal bir parça değil IP adresi ve port numasından oluşmuş bir yapıdır.

Bilgisayarlarımız üzerinde bir çok socket bulunur. Her socket tabanlı program için bilgisayar üzerinde ayrı port açılmıştır. Örneğin ftp sunucuları 21. portta, telnet ise 23. portta çalışmaktadır.

Socket programlama hakkında özet bir bilgiden sonra konunun daha anlaşılır olabilmesi için yaptığım küçük bir uygulamayı paylaşmak istiyorum.

Program, clientın server‘a gönderdiği sayının server tarafından karesi alınıp tekrar client’ a iletmesinden oluşuyor.  Burada karşımıza client ve server terimleri çıktı. Bu iki kavramdan da kısa bir şekilde bahsedelim;

Client’ı  socket programlarda hizmet isteyen istemci olarak adlandırabiliriz. İstediği zaman server’a bağlanıp istekte bulunur ve serverdan dönen cevabı alır. Yine istediği zaman bağlantıyı koparabilir.

Server da bu durumda socket programlarda hizmet veren sunucu oluyor. Client istediği zaman sunucuya bağlanabileceği için serverın sürekli açık olup, Clientın bağlanacağı portu dinliyor olması gerekmektedir.

Şimdi projenin kodlarını inceleyelim;

Client Kodları:


package socketapp;

import java.io.*;
import java.net.*;

public class client {

     public static void main(String[] args) throws IOException {
          islem();
     }

     public static void islem() throws UnknownHostException, IOException {
          Socket socket = null;
          PrintWriter out = null;
          BufferedReader in = null;
          String deger;
          try {
               //* server 'a localhost ve 7755 portu üzerinden başlantı sağlanıyor *//
               socket = new Socket("localhost", 7755);
          } catch (Exception e) {
               System.out.println("Port Hatası!");
          }

Yukarıda socket = new Socket (“localhost”,7755) olarak yazmamın sebebi projemi localde çalıştırıyor olmamdır. Yine localhost yerine 170.0.0.1 de yazabilirdik. Ama siz bu kısıma bağlanmak istediğiniz bilgisayarın (yani serverın) IP adresini yazabilirsiniz.

          //* Server'a veri gönderimi için kullandığımız PrintWriter nesnesi oluşturduk *//
          out = new PrintWriter(socket.getOutputStream(), true);

          //* Server'dan gelen verileri tutan BufferedReader nesnesi oluşturulur *//
          in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

          System.out.println("Server'a gönderilecek sayısı giriniz:");

          //* Gönderilecek sayının girişi yapılıyor *//
          BufferedReader data = new BufferedReader(new InputStreamReader(System.in));

          while((deger = data.readLine()) != null) {
               out.println(deger);
               System.out.println("Server'dan gelen sonuç = " + in.readLine());
               System.out.println("Server'a gönderilecek saysı giriniz");
          }
          out.close();
          in.close();
          data.close();
          socket.close();
     }
}

out.println(deger); koduyla Server ‘a datamızı gönderiyoruz.

Server Kodları:

package socketapp;

import java.io.*;
import java.net.*;

public class server {

     public static void main(String[] args) throws IOException {
          String clientGelen;
          ServerSocket serverSocket = null;
          Socket clientSocket = null;

          int sayi;

          try {
               //*Server 7755 portundan Client'ı dinliyor *//
               serverSocket = new ServerSocket(7755);
          } catch (Exception e) {
               System.out.println("Port Hatası!");
          }
          System.out.println("SERVER BAŞLANTI İÇİN HAZIR...");

Server 7755 portunu client’ ın bağlanması için dinliyor. Port açarken dikkat etmemiz gereken önemli bir konuda portun 1 ile 1024 arasında  olmamasıdır. Çünkü bu değer aralıklarındaki portlar spesifik portlardır ve root tarafından kullanılır. Eğer 1-1024 arasında bir portu kullanmaya çalışırsak programımız “bind permission” hatası verecektir.

          //* Bağlantı sağlamadan program bir alt satırdaki kod parçasına geçmez (accept) *//
          clientSocket = serverSocket.accept();

          //* Client'a veri gönderimi için kullandığımız PrintWriter nesnesi oluşturulur *//
          PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

          //* Client'dan gelen verileri tutan BufferedReader nesnesi oluşturulur *//
          BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

          while((clientGelen = in.readLine()) != null) {
               System.out.println("Client'dan gelen veri = " + clientGelen);
               sayi = Integer.valueOf(clientGelen);
               out.println(sayi*sayi);
          }
          out.close();
          in.close();
          clientSocket.close();
          serverSocket.close();
     }
}

clientGelen=in.readLine(); komutu istemciden gelen datayı okur ve clientGelen değişkenine aktarır. out.println(sayi*sayi) komutu ile istemciden gelen sayının karesini alıp tekrar istemciye iletiyoruz.

Programın ekran çıktıları şu şekildedir;

Client ekran çıktısı:

Server ekran çıktısı:

Java socket programlamayı özet bir şekilde anlatmaya çalıştım umarım faydalı bir yazı olmuştur. Bir sonraki yazımda socket pragramlamayı Android uygulaması üzerinde anlatmaya çalışacağım şimdilik konunun özeti bu kadar.

NOT: Projeyi çalıştırırken server class’ını ilk olarak çalıştırın. Çünkü clientın servera bağlanabilmesi için serverın açtığı portu dinliyor olması gerekir.

Herkese iyi çalışmalar diliyorum..

Misafir yazılım sever :)

32 Yorum + Yorum Ekle

  • Hocam emeğinize sağlık, çok etkili bir makale olmuş. Benim gibi bu konudan anlamayan biri için bile gayet açık ve anlaşılır. Hemen yazıp çalıştırdım bende. Okurken şöyle multiplayer bir satranç oyunu falan geçti aklımdan, bu tarz yazıları devam ettirirseniz neden olmasın :)

    • Beğendiğinize sevindim hocam, multiplayer bir oyun uygulaması güzel olabilir, neden olmasın =)

  • Teşekkürler emeğinize sağlık,java appletlerinede el atsaymışınız iyi olur :)

  • Teşekkürler emeğinize sağlık :)

  • harika bir yazı yeni başlayanlar için açık ve öz
    bu tür konular da türkçe makaleler bulmak çok güzel

  • Super olmus,elinize saglik

  • harika bir makale olmus… emeginize saglık Elif hanım 8)

  • Multiple nasıl olur yani birden fazla client birbirleriyle

    • Genel kod işleyişinde fazla bir fark olmayacaktır. Client’ların birbiriyle haberleşmesi için kendi içlerinde server kodlarını da barındırıyor olması gerekir. Yani karşı tarafa data göndereceği gibi karşı taraftan( başka bir client) gelen datayı okuyabilmesi için belirlenen bir portunun sürekli açık olup data akışını dinliyor olması gerekmektedir.

  • bu şekilde bir socket sohbet oluşturulamazmı? oluşturulursa nasıl yapılır? ilgilenirseniz sevinirim

    • Elif Hocam’ın ozan için gönderdiği cevap sizin sorunuza da cevap olabilir diye düşünüyorum. Vakit bulursa belki daha ayrıntılı bir makale ile de yanıt verebilir.

  • merhaba hocam tamam yazı çok güzel anlaşılır ama benim gibi daha yeni başlayan biri için direk dalmış sanki konuya bana öyle geldi klasörün içinde client server netbeans paketiin içinde mi geliyor netbeans prjecte bunu import mu ettiniz anlamadım import ettiyseniz o klasöre nereden ulaşabilirim.

    • External olarak herhangi bi paketi import etmenize gerek yok. Ben Elif Hocamın örneğini Eclipse kullanarak denemiştim. File->New->Java Project diyosunuz. Ardından projenize bir isim verip projeyi create ediyosunuz. Daha sonra Client ve Server isminde 2 tane java classı oluşturup Elif Hocamın verdiği kodları içlerine yazıyosunuz. İkisinde de üst kısma örneklerdeki gibi:

      import java.io.*;
      import java.net.*;

      yazabilirsiniz. Bunlar javanın kendi kütüphaneleri. Ben gereksiz import olmasın diye hepsini tek tek import ettim:

      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStreamReader;
      import java.io.PrintWriter;
      import java.net.ServerSocket;
      import java.net.Socket;

      şeklinde oluyor. Daha sonra önce Server.java sınıfını daha sonra Client.java sınıfını sağ tıklayarak Run As->Java Application diyoruz. Yazıda gösterilen ekran çıktılarının aynısını console’da görüyoruz.

  • Server:
    • Sistemde yer alan Client bilgisayarların bağlantı isteklerini kabul eder.
    • Bağlantı kurulan Client Writer ise Server, Client’ın gönderdiği host adını, IP adresini ve o andaki performans değerlerini ( işlemci yükü (yüzde), mevcut hafıza miktarı (MB), sistem saati) içeren bilgileri tablo şeklinde bir text dosyasına kaydeder. Bu tablo, Writer Client’tan gelen bilgilerle sürekli güncellenir.
    • Bağlantı kurulan Client, Reader ise Writer Client’lardan alınan ve tabloda tutulan bilgileri Reader Client’a gönderir.
    Writer Client:
    • Üzerinde çalıştığı host un bilgilerini (host adı, IP adresi, işlemci yükü, hafıza miktarı, saat) Server’a gönderir. Bunun için özel bir port kullanır.
    Reader Client:
    • Sistemdeki mevcut bilgisayarları sorgulamak için Server ile bağlantı kurarak Client bilgilerini alır, bir text dosyasına kaydeder. Server’a özel bir port ile bağlanır.
    Client bilgisayar, hem Writer hem de Reader olarak da görev yapabilecektir. Server ile bağlantı kurulurken Writer veya Reader Client olduğu bilgisini göndermelidir. Gelen isteğe göre Server işlemlerini gerçekleştirmelidir.

    3. Proje geliştirirken multithreading (thread havuzu oluşturulacak, işlemler havuzdaki threadlere yaptırılacak) ve synchronization teknikleri kullanılacaktır. Gerekli kütüphaneler, .dll dosyaları… vs proje dosyasına eklenecektir.

    Java konusunda çok eksikliklerim var dönem içinde verilen bir proje temel mantığını anlamamda yardımcı olursanız çok sevinirim.

  • hocam projeyi netbeansta aynen yazdım dediğiniz gibi ilk önce serverı çalıştırdım fakat çalıştırınca run diyor öyle kalıyor sonra uzun zaman aynen kalıyor cilenta bastığım zamanda hata veriyor başka programlarda aynı hatayı veriyor bunun sebebi ne olabilir acaba benim ağ’da mı problem var yoksa port numaralarınımı yanlış giriyorum anlamadım…şimdiden teşekkür ederim

    • Merhaba, bilgisayar üzerinde programların kullandığı bazı özel portlar vardır eğer bu portları kullanırsanız çakışma meydana gelecektir. Bunun gibi bir çok sebepten hata çıkmış olabilir. Eğer hata mesajını tam olarak yazabilirseniz daha kapsamlı yardımcı olabilirim. Teşekkürler, iyi çalışmalar.

  • Hocam merhaba ilk olarak paylaşımınız için teşekkür ederim çok yararlı ve faydalı bir paylaşım olmuş işime çok yaradı.Ek olarak sormak istediğim sorular var.İki tane bilgisayarı üzerinde(birisi server diğeri client olarak kullanılmak üzere) bu programı hub yada kablo yardımıyla çalıştırmak istesek hangi adımları izlememiz lazım.Server kodunu bir bilgisayarda client kodunu diğer bilgisayarda yazsak ve ve çalıştırsak amacımıza ulaşmış olurmuyuz.Ayrıca localhost yerine bu iki bilgisayarın ip adreslerini yazmamız mı gerekecek.Vereceğiniz bilgiler için teşekkürler.

    • Merhaba Oğuz, localhost yazma sebebimiz client ve server’ın kendi pc’miz üzerinde çalışıyor olmasıydı. Eğer serverımız başka bir bilgisayar ise serverın ip’sini “ socket = new Socket (SERVER IP,7755) ” kod bloğunda belirttiğim yere yazarsanız iki farklı bilgisayar ağ ortamında haberleşiyor olacaktır. Teşekkürler, iyi çalışmalar.

  • Hocam okuduğum en iyi Java Socket Programlama yazısıydı. Teşekkürler.

  • merhaba Elif hanım;
    programınızı çalıştırdığımda birkaç adımdan sonra ” Exception in thread “main” java.net.SocketException: Software caused connection abort: recv failed ” böyle bir hata alıyorum. Araştırdım ancak bir şey bulup düzeltemedim. Yardımcı olursanız çok sevinirim

  • Hocam merhaba gerçekten çok iyi ve anlaşılır bir yazı olmuş öncelikle teşekkür ederim paylaşımlarınız için.Bende bu konuyla ilgileniyorum bir proje geliştiriyorum. Ancak android üzerinde kullanmam gerekiyor.Mobilden bilgi gönderilecek. Web sitesinden bu gönderilen veriler anlık görülebilecek. Webden de gönderilen veriler android uygulamada anlık olarak görülebilecek. Dediğiniz gibi android uygulama üzerinden de paylaşımınızı bekliyorum o yüzden. Hangi yolları izlemeliyim neler yapmam gerekiyor ne kullanmam gerekiyor yazı hazırlanana kadar ön bilgi alabilir miyim:) Teşekkürler paylaşımlarınızı bekliyoruz.

  • Elif Hanım Merhabalar ;

    Elinize sağlık çok net ve çok güzel bir yazı olmuş. Teşekkürler emeğinize. İyi çalışmalar.

  • Merhabalar Elif Hanım ,

    öncelikle elinize saglik. benim sorum Jboss ile websocket ve soap ile bilginiz varmi?

    Selamlar.

    Vedat

  • Hocam android için bekliyoruz yazınızı hala:)

  • Merhaba android için socket io nasıl kullanılacağı ile ilgili bi çalışmanız var mı ?

  • socket programlama konusunda en iyi Turkce anlatimlardan birisi.. belki de en iyisi. yararli bilgiler icin tesekkurler

  • Çok iyi bir anlatım teşekkür ederim.

  • Merhaba öncelikle yazı için teşekkürler,
    Port numarası olarak 443 nasil verebilirim yardimci olur musunuz?

  • java yı indirebileceğim bir link söylermisiniz

  • Hocam emeğinize sağlık . Fakat programı çalıştırırken
    /*Error: Could not find or load main class server
    şöyle bir hata aldım . hatayı compile ederken değil run ederken veriyor.
    ->javac server.java
    ->javac client.java
    ->java server
    sırasıyla bu komutları verince sonuncuda hata alıyorum
    Linux terminalde çalıştırıyorum.
    JDK yüklüdür.

  • Elinize sağlık çok güzel bir kaynak olmuş :)

Yorum Gönder ali

Populer Yazılar

Son Yorumlar

Tweetler