Burak IŞIKLI :))

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

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

UDP

Bu protokolde iletişimde güvenlik önemli değildir. UDP’nin en önemli özelliği ise Datagram kullanılmasıdır. Bağlantı yaparken DatagramSocket ve DatagramPacket kullanılmaktadır.


package edu.burakkk.cliser.udp;

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

public class Server {
 public static void main(String args[]) {
 DatagramSocket aSocket = null;
 try {
 aSocket = new DatagramSocket(6789);
 // create socket at agreed port
 byte[] buffer = new byte[1000];
 while (true) {
 DatagramPacket request = new DatagramPacket(buffer,
 buffer.length);
 aSocket.receive(request);
 DatagramPacket reply = new DatagramPacket(request.getData(),
 request.getLength(), request.getAddress(), request
 .getPort());
 aSocket.send(reply);
 }
 } catch (SocketException e) {
 System.out.println("Socket: " + e.getMessage());
 } catch (IOException e) {
 System.out.println("IO: " + e.getMessage());
 } finally {
 if (aSocket != null)
 aSocket.close();
 }
 }
}

Sunucu sınıfımızda aynen TCP protokolünde olduğu gibi uygun olan portu açıyoruz ve yayına başlıyoruz.


 package edu.burakkk.cliser.udp;

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

public class Client {
 public static void main(String args[]) {
 // args give message contents and destination hostname
 DatagramSocket aSocket = null;
 try {
 aSocket = new DatagramSocket();
 byte[] m = args[0].getBytes();
 InetAddress aHost = InetAddress.getByName(args[1]);
 int serverPort = 6789;
 DatagramPacket request = new DatagramPacket(m, args[0].length(),
 aHost, serverPort);
 aSocket.send(request);
 byte[] buffer = new byte[1000];
 DatagramPacket reply = new DatagramPacket(buffer, buffer.length);
 aSocket.receive(reply);
 System.out.println("Reply: " + new String(reply.getData()));
 } catch (SocketException e) {
 System.out.println("Socket: " + e.getMessage());
 } catch (IOException e) {
 System.out.println("IO: " + e.getMessage());
 } finally {
 if (aSocket != null)
 aSocket.close();
 }
 }
}

Client ise tcp’den farklı olarak argüman olarak bağlanacağımız adresi veriyoruz. Yani süreci(process) çalıştırırken arg olarak ip adresini veriyoruz.

MULTICAST

UDP’ye benzer olarak multicast olarak yayın yapabiliriz. Ancak bu bir protokol değildir. UDP yöntemini kullanmaktadır ancak burada önemli olan bir tek istemci değil birden fazla istemci(yani bir grup)’tur. Yani gruba bağlı yayın yapılmaktadır.

package edu.burakkk.cliser.multicast;

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

public class Multicastpeer {
 public static void main(String args[]) {
 // args give message contents and destination multicast group (e.g.
 // "228.5.6.7")
 MulticastSocket s = null;
 try {
 InetAddress group = InetAddress.getByName(args[1]);
 s = new MulticastSocket(6789);
 s.joinGroup(group);
 byte[] m = args[0].getBytes();
 DatagramPacket messageOut = new DatagramPacket(m, m.length, group,
 6789);
 s.send(messageOut);
 byte[] buffer = new byte[1000];
 for (int i = 0; i < 3; i++) { // get messages from others in group
 DatagramPacket messageIn = new DatagramPacket(buffer,
 buffer.length);
 s.receive(messageIn);
 System.out.println("Received:"
 + new String(messageIn.getData()));
 }
 s.leaveGroup(group);
 } catch (SocketException e) {
 System.out.println("Socket: " + e.getMessage());
 } catch (IOException e) {
 System.out.println("IO: " + e.getMessage());
 } finally {
 if (s != null)
 s.close();
 }
 }
}
<pre>

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.