Bu sayfayı açıp okuduğunuza göre, web kelimesini kullandığımda Google'ı açıp web entry sini aratmayacağınızdan şüphem yok:)) Hepimiz az çok web konusunda bilgi sahibiyiz. İnternet bağlantısı için tarayıcı ip gibi aracılar kullanırız. Karşımıza çıkan sayfadan isteklerimiz doğrultusunda button(tuş) ya da arama çubuklarıyla başka sayfalara yöneliriz. Birçok bilgisayarın sahip olduğu bilgiye Explorer, Firefox, Opera gibi tarayıcı (browser) denilen pencerelerden webe rahatlıkla ulaşabiliriz. Ulaştığımız bu bilgiler bilgisayarımızın bir köşesinde bizim onları keşfetmemizi mi bekliyordu? Tabi ki hayır cevabını alacağımı biliyorum. Peki bu bilgilere tam olarak nasıl ulaştığımızı sorsam? Vereceğiniz cevapta soket kelimesi geçecek mi?

Bu yazımda Java'da soket sınıfının kullanımından bahsetmeye çalışacağım. Soketler sizin internet bağlantınızın ve diğer bağlantıların arasında duran soyut birimlerdir. Nerelerde kullanılır? İnternette, webde diyeceksiniz. Bu iki kelimenin birbirinden farkı nedir? Internet bilgisayarlar, intranetler arası bağlantıyı sağlarken; web İnternet üzerinde çalışır ve "www" ile başlayan adreslerdeki sayfaların görüntülenmesini sağlar. Peki bağlantı nasıl sağlanır? İstemci sunucudan veri isteminde bulunur, sunucu da bu istemi değerlendirir, bir port aracılığıyla yanıt verir.

Soru sordukça terim sayısı artmakta farkındayım:) İstemci, sunucu, port kelimelerini de ele alıp, soket konusunu biraz daha açıklığa kavuşturalım. İstemci veriyi isteyen soket programıdır. Sunucuya bağlanır, isteğini iletir, bağlantısını kapar. Sunucu ise veriyi veren soket programdır. İstemi alıp değerlendirir, gerekli yanıtı ıstemciye iletir. Sunucunun istemine herhangi bir anda yanıt verebiliyor durumda olması için devamlı çalışması lazımdır. İstemciye örnek olarak httpd, telnetd, nfsdyi verebiliriz. Port ise soketlerin bağlantı kurmak için kullandığı kanaldır. İstediğimiz zaman bağlantı kurmak için bilgisayarımızda aştığımız bir kapı gibi düşünebiliriz portu.

Soket bağlantımın uç noktası, istemciyi tarayıcım aracılığıyla kullanıyorum, sunucu bana bilgi iletiyor ama nasıl? Bu soruya cevap alabilmeniz için umarım yazımın kalan kısmı giriş niteliğinde de olsa işinize yarar. Aşağıda Java kullanarak kendi sunucunuzu yazabilmeniz için küçük yardımcı bilgiler bulabilirsiniz.

Socket sınıfını kullanabilmek için önce onun namespace'ni import etmemiz gerekiyor.

import java.net.*;

Sunucu kısmı için kullanacağımız sınıfın adı "ServerSocket", aşağıda bu sınıfın tanımlanmasını görmektesiniz.

ServerSocket server;

Sunucunuzun internete bağlanması için onu bir porta yönlendirin. Portların numaraları vardır. portNo'ya istediğiniz bir port numarasını atayın ve bu port numarasıyla yeni bir ServerSocket nesnesi oluşturun.

int portNo;
server=new ServerSocket(portNo);

Programınız aşağıdaki satırda istemciden istek gelene kadar bekleyecektir. "accept" komutu istemciden gelen istemi farkeder ve istem bilgileri doğrultusunda yeni bir soket nesnesi oluşturur. Yeni oluşan soket nesnesi istemciyi sunucu tarafında temsil eder diyebiliriz.

Socket socket=server.accept();

İnternet ağına bağlı cihazlara addres olarak atanan numara IP (internet protocol adress) dir. Örneğin kendi makinanızda local host unuzun IP'si 127.0.0.1 dir. Localhostumuzun IP'sini ağdaki adres olarak değil, makinanızın adresi olarak düşünelim. "getInetAdress" burada bize istemcinin IP'sini verecektir.

socket.getInetAddress();

socket nesnelerini içine veri yazılabilir ve içinden veri okunabilir dosyalar olarak düşünebiliriz. İstemcinin bizden ne istediğini anlayabilmek için istemciyi temsil eden socket nesnesinin içeriğini elde edip değerlendirmemiz, yani okumamız lazım. Aynı zamanda istemciye bilgi aktarabilmek için soket nesnesine veri aktarmamız yani yazabilmemiz lazım. İstenen verileri soket nesnesine aktarabilmek için öncelikle veri çıktı işlemlerini kontrol edebileceğimiz bir "OutputStream" nesnesi yaratmalıyız. Bunun için dosyanızın başına OutputStream nesnesinin dahil olduğu java.io namespace'sini eklemeyi unutmayın.

import java.io.*;
// yıldız karakteri o sınıfın altında tanımlı olan herşeyi import etmemize neden olacaktır
//genel olarak bundan kaçının.
OutputStream output; 
// gerekli outputstream nesnesi tanımı
output = socket.getOutputStream(); 
// soketin outputstream nesnesine output nesnesi referans olarak atanır.
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream())); 
// soketten veri okumak içinse inputstream nesnesine bir bufferedstream nesnesi referans olarak atanır.

Artık istenen verileri yazmak için byteleri arguman olarak output nesnesinin write metodunu;

output.write(...);

istenen bilgileri satır satır okumak için reader nesnesinin readline metodunu;

String line;
line = reader.readline();

kullanabilirsiniz.

Okuma ve yazma işlemleriniz bittikten sonra, socket ve bufferedreader nesnelerini kapamayı unutmayın.

reader.close();
socket.close();

Eğer kendi sunucu programınızı yazmaya karar verdiyseniz, sunucunuzun sürekli açık olmak zorunda olduğunu unutmayın. Bu durumu serversocket nesnenizi while(true) döngüsü içinde oluşturarak elde edebilirsiniz.

Biraz araştırmayla programınızı tamamlamanız dileğiyle. Kolay gelsin.