İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Onder Teker
on_der_tek_er@yahoo.com

Text Tabanlı Socket Communication'ları

Client ve server arasında text tabanlı socket communication kuran bir örnek proje. Bu örnekte önce client server'a selam veriyor sonra server client'ı selamlıyor. Client, server'ın yolladığı selamı alınca iletişim tamamlanmış oluyor. Bu yapı game ve chat gibi online işleyen yazılımlar için gerekli teknolojiyi gösteriyor. Selam yerine client server'a oyuncunun yaptığı hamleyi bildirir. Server da bu mesaj değerlendirilir ve karşılığında bir yanıt döner. Client bu son gelen mesajı değerlendirerek yolladığı komutun karşılığında server'ın ne tepki verdiğini öğrenir. Socket tabanlı network yazılımlarında kullanılan teknoloji bu örnekte anlatılanlardan farklı değildir. Mantık ise yazılımdan yazılıma değişmektle birlikte bu örnektekine benzerdir. Sadece hata kontrolleri profesyonel yazılımış bir programda olması gereken özellikler eklenir.

SocketCommunicator

Bu class bir Thread içerisinde socket iletişimi yapmaktadır. Bir socket'in OutputStream'ine yazma, InputStream'inden okuma gibi işlemleri yapmaktadır. Bununla bir server'ın bir client'la olan iletişimi gerçekleştirlmiş olur. Aslında bu iletişimi asıl yapan class'lar GreetingClient ve ClientHandler class'larıdır. GreetingClient client'ı temsil edier. ClientHandler da server'ın bir client'la konuşmasını sağlayan class'dır. Bu ikisini de socket communication'u yapan thread'ler olduğu için ortak kodu SocketCommunicator'a yazılmıştır.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import java.net.*;
  2 import java.io.*;
  3 import java.util.*;
  4 abstract public class SocketCommunicator
  5     extends Thread
  6 {
  7   private Socket socket=null;
  8   private  BufferedReader reader=null;
  9   private  BufferedWriter writer=null;
 10   private List messages=new ArrayList();
 11   private long sleep=1000;
 12   private boolean readBeforeWrite=false;
 13   public SocketCommunicator(Socket socket,long sleep,boolean readBeforeWrite)
 14       throws IOException
 15   {
 16     this.socket=socket;
 17     this.sleep=sleep;
 18     this.readBeforeWrite=readBeforeWrite;
 19     setPriority(Thread.MIN_PRIORITY);
 20     initReader();
 21     initWriter();
 22   }
 23   private void initReader()
 24       throws IOException
 25   {
 26     InputStream is=socket.getInputStream();
 27     InputStreamReader isr=new InputStreamReader(is);
 28     reader=new BufferedReader(isr);
 29   }
 30   private void initWriter()
 31       throws IOException
 32   {
 33     OutputStream os=socket.getOutputStream();
 34     OutputStreamWriter osw=new OutputStreamWriter(os);
 35     writer=new BufferedWriter(osw);
 36   }
 37   public void addMessage(String message){
 38     synchronized(messages){
 39       messages.add(message);
 40     }
 41   }
 42   private void writeMessages()
 43       throws IOException
 44   {
 45     synchronized(messages){
 46       Iterator i=messages.iterator();
 47       while(i.hasNext()){
 48         String message=(String) i.next();
 49         writer.write(message+"\n");
 50         writer.flush();
 51         i.remove();
 52       }
 53     }
 54   }
 55   private void readMessages()
 56       throws IOException
 57   {
 58     if(reader.ready()){
 59       String message=reader.readLine();
 60       messageReceived(message);
 61     }
 62   }
 63   abstract protected void messageReceived(String message);
 64   public void run(){
 65     while(true){
 66       try{
 67         if(readBeforeWrite){
 68           readMessages();
 69           writeMessages();
 70         }else{
 71           writeMessages();
 72           readMessages();
 73         }
 74         Thread.sleep(sleep);
 75       }catch(Exception e){
 76         e.printStackTrace();
 77       }
 78     }
 79   }
 80 }

GreetingClient

Bu class client'ı temsil ediyor. Communication işlemlerinin çoğunu SocketCommunicator'tan devraldığı burada sadece alınan mesajın değerlendirilmesi ve mesaj gönderilmesi var. Ayrıca client application'u bu olduğu için main() methodu içeriyor. Kullancının standart input'tan girdiği mesajları server'a yolluyor. Server'dan gelen yanıtları da ekrana basıyor.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import java.net.*;
  2 import java.io.*;
  3 import java.util.*;
  4 public class GreetingClient
  5     extends SocketCommunicator
  6 {
  7   public GreetingClient(String host,int port,long sleep)
  8       throws IOException
  9   {
 10     super(new Socket(host,port),sleep,false);
 11   }
 12   protected void messageReceived(String message){
 13     System.out.println("Server > "+message);
 14     if(message.equals("Merhaba İstemci")){
 15       System.out.println("Artık Birbirimize Bağlandık");
 16     }
 17   }
 18   public static void main(String[] args)
 19       throws Exception
 20   {
 21     final String host="localhost";
 22     final int port=9999;
 23     final long sleep=1000;
 24     GreetingClient client=new GreetingClient(host,port,sleep);
 25     client.start();
 26     System.out.println("Enter Your Message");
 27     boolean greeting=true;
 28     while(greeting){
 29       InputStream is=System.in;
 30       InputStreamReader isr=new InputStreamReader(is);
 31       BufferedReader br=new BufferedReader(isr);
 32       String message=br.readLine();
 33       client.addMessage(message);
 34     }
 35   }
 36 }

ClientHandler

Bu class server'da her bir client'la iletişim kurma işlevini görüyor.Server kendisine bağlanan her client için bir ClientHandler yaratıryor ve aktifleştiriyor. Client'ın gönderdiği mesajları değerlendirmek ve yanıt vermek onun işi.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import java.net.*;
  2 import java.io.*;
  3 import java.util.*;
  4 public class ClientHandler
  5     extends SocketCommunicator
  6 {
  7   private ServerSocket serverSocket=null;
  8   public ClientHandler(ServerSocket server,Socket socket,long sleep)
  9       throws IOException
 10   {
 11     super(socket,sleep,true);
 12     String address=socket.getInetAddress().getHostAddress();
 13     System.out.println("GreetingServer > A client connected : "+address);
 14   }
 15   protected void messageReceived(String message){
 16     System.out.println("Client > "+message);
 17     if(message.equals("Merhaba Sunucu")){
 18       addMessage("Merhaba İstemci");
 19     }
 20   }
 21 }

GreetingServer

Bir port'ta kendisine bağlanan client'larla iletişim kurmaya yarayan class. Kendisine bağlanan client için bir ClientHandler yaratıyor ve client socket'i ona devrediyor. Ayrıca server application'unu çalıştırmak için bir main() methodu içeriyor.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import java.net.*;
  2 import java.io.*;
  3 public class GreetingServer
  4     extends Thread
  5 {
  6   private ServerSocket serverSocket=null;
  7   private long sleep=1000;
  8   public GreetingServer(long sleep)
  9       throws IOException
 10   {
 11     setPriority(Thread.MIN_PRIORITY);
 12     serverSocket=new ServerSocket(9999);
 13   }
 14   public void run(){
 15     int port=serverSocket.getLocalPort();
 16     System.out.println("GreetingServer > Starting at port "+port);
 17     while(true){
 18       try{
 19         Socket socket=serverSocket.accept();
 20         ClientHandler handler=new ClientHandler(serverSocket,socket,sleep);
 21         handler.start();
 22       }catch(IOException e){
 23         e.printStackTrace();
 24       }
 25     }
 26   }
 27   public static void main(String[] args)
 28       throws Exception
 29   {
 30     final long sleep=1000;
 31     GreetingServer server=new GreetingServer(sleep);
 32     server.start();
 33   }
 34 }

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır