Server(sunucu),client(istemci) olmak üzere haberleşme iki tür karakterden oluşmaktadır.Karakterlerin sayısı haberleşmenin kullanılacağı alana göre değişebilir(N server-n client,1 server-N client,1 server-1 client gibi)
TCP haberleşmesi OSI nin transport(geçiş) katmanında gerçekleşen olaydır.Yani paketlerin tek tek değilde bir bütün halinde bir noktadan diğer noktaya gönderildiği kısımdır.
Server karakteri socket,bind,listen,acccept,read,write,close
Client karakteri socket,connect,write,read,close
aşamalarından oluşmaktadır.Hepsini tek cümlelerle özetleyecek olursak;
Server için
socket() : socket kelimesi IPC nin bilgisayarlar arası haberleşmesinde(yani bir ağ üzerinden konuşan iki process ten bahsediyoruz) kullanılan kanaldır.Bu kanal kod üzerinde göreceğiz IP ve port numarasıyla oluşur.
bind() : Sadece server tarafında kulanılan bir metod olup,işletim sistemi üzerinde oluşuturulan socket in haberleşmeye hazırlanması diyebilinir.
listen(): Sadece server da bulunur.Bağlanacak client lar için dinleme yapılır.
accept(): Server a bağlanmak isteyen bir client la iletişim kurulur.
read() : Server,client tan veri ister.client veriyi gönderir
write(): Server,client a veri gönderir,cevap döner.
close(): Açılan haberleşme socket i kapatılır.Kaynaklar boşaltılır.
Client için sadece connect() i açıklasak yeterli olur.
connect(): client tarafında bağlantının gerçekleşmesi sağlanır.
Şimdi gelelim Java dilinde kodlanan client ve server uygulamalarına.Kodlamada 1 server-1client mimarisinde kodlanmıştır.
client.java-> Client uygulaması
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class client {
public static void main(String[] args) {
String serverName ="localhost";
int port=8080;
System.out.println(serverName +" adresine ve "+port+" portuna baglaniliyor...\n");
try {
Socket socket = new Socket(serverName,port);
System.out.println(socket.getRemoteSocketAddress()+" ine baglanti basarili...\n");
OutputStream write = socket.getOutputStream();
DataOutputStream out =new DataOutputStream(write);
System.out.println("Ne istemistiniz :");
String gonderilecekMetin=metinGonder();//giris olarak yazdigimiz metin sunucuya gonderilir.
out.writeUTF(gonderilecekMetin +"\n");//istemci sunucuya veri gonderir.
InputStream read = socket.getInputStream();
DataInputStream in = new DataInputStream(read);
System.out.println("Sunucu diyor ki... "+in.readUTF()+"\n");//sunucudan veri alinir.
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String metinGonder(){
Scanner sc = new Scanner(System.in);
String metin =sc.nextLine();
sc.close();
return metin;
}
}
Kendi makinemizde çalışacağımız için server adresi "localhost" port olarakta "8080" kullanılmıştır.
Üretilen socket nesnesi yukarıda anlattığımız tcp nin socket() aşamasını gerçekleştirmektedir.
Yukarıda gördüğümüz gibi ilk write() sonra read() metodları işlemektedir.
write() metodunda client,kullanıcı tarafından girilen bir metni sunucuya göndermektedir.
read() metodunda ise server tarafında kodlanmış bilgi çekilmektedir.
Nihayetinde socket.close() satırında, close() metodu işlev görüyor.
Şimdi server uygulamasını görelim.
server.java-> Server uygulaması
//8080 portu dinlenmektedir.
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class server extends Thread {
private ServerSocket sSocket;
public server(int port){
try
{
sSocket = new ServerSocket(port);//socket() safhasi
sSocket.setSoTimeout(10000);
}
catch(Exception e){
}
}
public void run(){
while(true)
{
try{
System.out.println("Server port bekliyor..."+sSocket.getLocalPort());
Socket socket = sSocket.accept();
System.out.println("Belirtilen adrese baglanti basarilidir="+socket.getRemoteSocketAddress());
DataInputStream read = new DataInputStream(socket.getInputStream());
System.out.println(read.readUTF());//client tan veriler geliyor,read()
DataOutputStream write = new DataOutputStream(socket.getOutputStream());
write.writeUTF("Tesekkur ederiz "+socket.getRemoteSocketAddress()+" yine bekleriz\n");//client a veri gönderiliyor,write()
socket.close();//close() safhasi
}
catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}catch(IOException e)
{
e.printStackTrace();
break;
}
}
}
public static void main(String[] args) {
Thread thread = new server(8080);
thread.start();
}
}
Server uygulamasında thread yapısı kullanılmıştır.
->ServerSocket sınıfından sSocket nesnesi oluşturuldu //socket() aşaması.
->.setSoTimeout(10000) metodunda milisaniye cinsinden server ın dinlemeye açık olacağı süreyi belirlemekteyiz.
->Client yapısındaki metodlar kullanılmıştır.Farklı olarak bir accept() safhası olduğu için .accept() metodu kullanılmıştır.
->Main metodunda oluşturduğumuz thread de kullanacağımız portu girmekteyiz.