Burak IŞIKLI

Computer scientist living in Istanbul, Turkey. Data scientist at Turkcell, Traveller, Rower, Sailor

Twitter Github Linkedin Mail

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

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.


Comments !