26 Aralık 2016 Pazartesi

Java Networking (Server / Client)



Merhaba Arkadaşlar
Bu yazımda biraz java networking konusuna değineceğim. Uygulama olarakta eclipse te bir sunucu ve istemci oluşturup birbirlerine mesaj göndermeyi deneyeceğim. Uygulamaya geçmeden önce birkaç tanımdan bahsetmek istiyorum.

Socket : Bilgisayarların ağ üzerinden haberleşmesini sağlayan yapılar olarak düşünebilirsiniz. Uygulamamızda   da socket oluşturup öyle haberleşmeye çalışacağız. Ip adresine veya server adresine ihtiyacımızda olacak. Hangi bilgisayar iletişim kurulacak , ıp adresi ile belirleyeceğiz.
client : Hizmet isteyen olarak adlandırabiliriz. Türkçe olarak da istemci olarak adlandırılır.
Sunucu :  server olarakta adlandırılan bu yapılar , istemciye hizmeti veren yapılardır.

Yani uygulamamızda bir sunucu ve istemci olacaktır. Aradaki haberleşme socket/portlar üzerinden olacaktır. Sunucu nun sürekli açık olması gerekmektedir. Bu tür  uygulamalarda dikkat etmeniz gereken noktalardan bir tanesi , açtığınız portları işiniz bittiğinde kapatmanızdır. Kapatmaz iseniz arka planda sürekli boş yere çalışır ,bellekten yer ve ayrıca uygulamayı tekrar çalıştırdığınız da port zaten açık ise hata alabilirsiniz.

Anlatacak çok şey var bana göre ama ben her şeyi ve tüm fonksiyonları yazının uzamaması için anlatmayacağım.   Temelinde neler var onlara değinmeye çalışacağım Bunu da kod üzerinden anlatmayı düşünüyorum. Bu konu ile alakalı sunucu ve istemci tarafında çalışan metotlara da bakmanızda fayda var. ben hepsini anlatmak isterdim ancak çokta uzatmak istemiyorum. Basit bir sunucu ve istemci oluşturmak için gerekli olan metotlara değineceğim.
Ayrıca internette 1 -1024 arası portlar genel olarak nette kullanılan belirli portlar olduğu için  , port numarası verirken bu sayılar arasındaki değerleri vermeyin hata alırsınız. Şimdi Kodlar üzerinden anlatmaya çalışayım.

Sunucu Tarafı :


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

public class MyServer extends Thread {
     
      //sunucu tarafında çalışacak bir socket tanımlıyoruz
      //istemci den gelecek veriyi okuması için
         private ServerSocket serverSocket;
        
         public MyServer() throws IOException {
               //bir port açıyoruz.İstemci ile haberleşme bu port üzerinden olacak.
               //1-1024 arası olmamasına dikkat edin.
            serverSocket = new ServerSocket(5217);
         
         }

         public void run() {
            while(true) {
               try {
                   
                   //getlocalport() metodu , sunucuya bağlanan istemciyi görmenizi sağlar
                  System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
                 
                  //Serversocket sunucu tarafında ki socket.Port açmak için kullanıyoruz
                  //Socket türündeki değişkeni ise istemci den veri alması için kullanacağız.
                  //accept() metodu , sunucunun  ,istemciyi dinlemesini  yani istemciden veri almasını sağlar.
                  Socket server = serverSocket.accept();
                 
                 //getInputStream() metodu istemciden gelen mesajı almak için
                  //DatainputStream ise gelen mesaj ile sunucu tarafında işlem yapmak için kullanacağız.
                  //Yani istemciden gelen mesajı DataInputStream içerisine atıyoruz.
                  //Bunun için iki metod vardır:
                  //input stream : istemciden gelen mesaj word , excel gibi veya daha farklı veri paketleri ise kullanılır.
                  //input stream i kullanırsanız eğer , gelen mesajın ne olduğunu bulmanız ve ona göre parse etmeniz gerekir.
                  //Datainputstream : istemciden gelen mesaj int ,string,char gibi primitive tipinde ise kullanılır.
                  DataInputStream in = new DataInputStream(server.getInputStream());
                 
                  //istemciden aldığım mesajı ekrana yazdırıyorum
                  //readLine, readInt ,readFloat gibi bir çok seçenek mevcut
                  System.out.println(in.readUTF());
                 
                  //Dataoutput stream da sunucudan ,istemciye veri gönderilmek için kullanılır
                  //output stream şeklinde bir kullanımı daha vardır.
                  //input stream ve datainputstream arasında ki kullanım farkı bunlar içinde geçerli
                  DataOutputStream out = new DataOutputStream(server.getOutputStream());
                 
                 
                  out.writeUTF("Bağlandık " + server.getLocalSocketAddress()
                     + "\Güle Güle!");
                 
                  //işiniz bittikten sonra portun kapatılması gerektiğiniden bahsetmiştik
                  server.close();
                 
               }catch(SocketTimeoutException s) {
                  System.out.println("Socket timed out!");
                  break;
               }catch(IOException e) {
                  e.printStackTrace();
                  break;
               }
            }
         }
        
         public static void main(String [] args) {
            try {
               Thread t = new MyServer();
               t.start();
            }catch(IOException e) {
               e.printStackTrace();
            }
         }
      }




İstemci Tarafı



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

public class MyClient {

   public static void main(String [] args) {
    
    
      try {
         //İstemci için bir socket tanımlıyoruz.
        //ilk parametre ip adres , ikinci parametre ise sunucu tarafında açtığımı port
         Socket client = new Socket("localhost", 5217);
        
         //bağlantı kurulan adresi görme
         System.out.println("Bağlanıldı : " + client.getRemoteSocketAddress());
        
         // server tarafında buralara değindik
         OutputStream GoServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(GoServer);
        
         out.writeUTF("Merhaba : " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
        
         System.out.println("Server :" + in.readUTF());
         client.close();
      }catch(IOException e) {
         e.printStackTrace();
      }
   }
}


Bu  ve başka projeleri kaynak kodları ile beraber github adresim  https://github.com/bhtyrsm   da bulabilirsiniz.
Öncelikle  serverı çalıştırın. Sonra clienti çalıştırın.Server çalışmadan client bağlantı kuramaz ve hata alırsınız.

Herhangi bir sorunda ileşime geçebilirsiniz .umarım faydalı olmuştur .Kolay gelsin.






Hiç yorum yok:

Yorum Gönder

DataTable To List Object - C#

Merhaba Arkadaşlar , Daha önce kullandığım kısa bir kod parçasını sizinlede paylaşmak istedim.  Elimizde bulunan bir Datatable ı nasıl ...

Popüler Yayınlar