Burak IŞIKLI :))

Client-Server(İstemci-Sunucu) Programlama-1

Posted in Java by Burak IŞIKLI on 11 Haziran 2009

Client-Server(Sunucu-İstemci) programlama yaparken bilmemiz gereken bazı kavramlar var. Programlama yaparken network(ağ) altyapısını iyi bilmemiz gerekiyor. Ağ’da her katmanın özelliğini anlamamız gerekiyor. Eğer bilmiyorsanız OSI katmanlarını öğrenmenizi tavsiye ederim. Biz kullanacağımız katman orta katmandır. Haberleşme türü olarak Socket Communication(Soket İletişimi)’i kullanacağız. Soket iletişimi  TCP ve UDP iletişimi olmak üzere iki farklı protokölle sağlanır.   TCP ile UDP protokolünün farkı; UDP protokolünü güvenlik olmaksızın iletişim sağlanacağında örneğin online radyo(streaming) gibi, TCP protokolünü ise güvenliğin ön planda olduğu iletişimde kullanıyoruz. Öncelikle TCP protokolünü kullanarak programımızı yapacağız.

TCP

Bir istemci bir de sunucumuz olacaktır. Sunucumuz istemcilere yayın yaparak gönderilmesi gereken bilgileri gönderecektir. Ancak bunu güvenli bir iletişim yoluyla yapacaktır.


package edu.burakkk.cliser.tcp;

/**
 * 
 * A Simple Client-Server 
 * Server
 *  
 *@version 1.0
 *@author Burak ISIKLI
 *@date July 09, 2009
 *
 **/

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

public class Server {
 public static void main(String args[]) {
 try {
 ServerSocket sock = new ServerSocket(5000);
 // Listen for connections
 while (true) {
 System.out.println("Waiting for client");
 Socket client = sock.accept();

 // We have a connection
 System.out.println("Connected with client");
 PrintWriter pout = new PrintWriter(client.getOutputStream(),
 true);

 // Write the Date to the socket
 System.out.println("Sent data to client");
 pout.println(new Date().toString());

 // Close the socket
 // and resume listening for more connections

 client.close();
 pout.close();
 }
 } catch (Exception e) {
 System.err.println(e);
 }
 }
}

Sunucunun yayın yapacağı portun seçimi bu konuda en önemli konudur. 0-1023 arasındaki portlar başka uygulamalarda kullanıldığı için bu portlar dışında bir portu seçerseniz bir sorun çıkacağını sanmıyorum. Ben örneğimde 5000 portunu seçtim. ServerSocket objesini yaratılırken bunu yaptığımı görebilirsiniz. PrintWriter objesiyle istemciye gönderilecek ögeler yazılacaktır(pipeline edilecek) Yani istemci her istekte bulunduğunda sunucu kendi tarihini karşı tarafa gönderecektir.


package edu.burakkk.cliser.tcp;

/**
 * 
 * A Simple Client-Server 
 * Dummy Client
 *  
 *@version 1.0
 *@author Burak ISIKLI
 *@date July 09, 2009
 *
 **/

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

public class Client implements Runnable {
 public void connect() {
 try {
 Socket sock = new Socket("127.0.0.1", 5000);
 InputStream in = sock.getInputStream();
 BufferedReader bin = new BufferedReader(new InputStreamReader(in));
 String line;
 while ((line = bin.readLine()) != null)
 System.out.println(line);
 sock.close();
 } catch (IOException ioe) {
 System.err.println(ioe);
 }
 }

 public void run() {
 while (true) {
 try {
 Thread.sleep(1000);
 connect();
 } catch (Exception e) {
 System.out.println("Error : " + e);
 }
 }
 }

 public static void main(String[] args) throws Exception {
 Thread Debugger = new Thread(new Client());
 Debugger.start();
 Debugger.join();
 }
}

İstemciyi yaparken thread mantığıyla yaptığımız dikkatinizi çekmiştir. Bunun nedeni eğer thread mantığıyla yapmazsak istemci bir sefer istekte bulunacak ve program sonlandırılacaktır. Bu nedenle sürekli hale getirerek 1 saniye arayla istekte bulunacaktır. Socket objesine yaratırken ip adresini ve portunu yazmamız gerekiyor. Biz kendi kendine sanal bağlantı yapılacağı için(dummy client) 127.0.0.1 adresine verdik ancak buraya gerçek ip adresini yazmanız gerekecektir. Port ise sunucuya verdiğimiz port ile aynı olmak zorundadır. Biz 5000 ‘ni vermiştik. Inputstream ve bufferedreader ise gönderilen cevapları okumak için yaratıyoruz.

10 Yanıt

Subscribe to comments with RSS.

  1. gurcanyavuz said, on 11 Haziran 2009 at 23:01

    işte budur hocam. Bu yazılardan istiyoruz.

  2. tugba said, on 18 Ağustos 2010 at 23:41

    bunu nasıl calıstırıcaz

  3. Gökhan Gökdoğan said, on 17 Aralık 2010 at 12:56

    Program için çok sağol. Ama ben bunu bir bilgisayarın kendi içinde haberleşmesi şeklinde değil de , iki farklı bilgisayarı haberleştirmek için kullandığımda, client programındaki ip kısmına, server bilgisayarın ipsini yazdığımda haberleşme gerçekleşmedi, bi fikrin var mı neden olabilir?

    • Burak IŞIKLI said, on 17 Aralık 2010 at 13:11

      Hata aldınız mı? Aldıysanız ne gibi bir hata aldınız?

      • Gökhan Gökdoğan said, on 17 Aralık 2010 at 14:12

        Hata vermiyo sorun orda zaten , herhangi bi hata olmuyo , yani server ve client tarafı sorunsuz gözüküyo, ama iletişim bazen gerçekleşiyo bazen gerçekleşmiyo. Ben de acaba tek bilgisayar içinde haberleşme ile, iki farklı pc arasında haberleşme arasında fark var mı acaba , ya da yapmamız gereken başka birşey var mı diye düşündüm.

      • Gökhan Gökdoğan said, on 17 Aralık 2010 at 15:21

        Araştırdığım kadarıyla osi layerlardan istemcinin ip layerından serverin ip layerına gidene kadar bi sorun oluşmuş olsa başka türlü belli edermiş, yani serverin in ipsinden Tcp layerına yükselme aşamasında bişey olabilir diye düşünüyorum.

      • Gökhan Gökdoğan said, on 22 Aralık 2010 at 14:12

        yardımcı olursanız minnettar olucam, şimdiden sağolun

  4. Mert Çetin said, on 17 Aralık 2010 at 17:03

    sağol aynı soruya ben de takıldım

  5. Gökhan Gökdoğan said, on 22 Aralık 2010 at 14:14

    Önceki yazdığım geldi mi bilmediğim için tekrar yazıyorum. Ne sunucu ne de istemci tarafında bir hata almadım. İnternet bağlantımı da kontrol ettim ve sıkıntı yok. Ama iki ekranda da herhangi bi değişiklik olmadı.


Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: