Bu yazı Pc Maps için Amine Kaçmaz tarafından yazılmıştır.
Socket dendiği zaman birçok kişinin zihninde canlanan bilgisayarlarımızın üzerinde bulunan somut bir donanımsal parça oluyor. Aslında socket; bilgisayarların ağ üzerinden haberleşmesini sağlayan yapılardır. Tabi bunun için bazı adresler kullanmak zorundayız. Bunlardan ilki bilgisayarın IP adresi.
IP adresi yardımıyla hangi bilgisayarla haberleşeceğimizi belirleriz. Haberleşilecek bilgisayara ulaşıldığı zaman, bu bilgisayar üzerinde hangi programla iletişime geçeceğimizi belirtmemiz gerekiyor . İşte burada bilgisayarlarımızın portları devreye giriyor. Yani iki bilgisayar birbiriyle bu iki yapı vasıtasıyla haberleşir (IP adresi ve Port).Socket de bu iki kavramdan oluşuyor. Yani socket bilindiğinin aksine donanımsal bir parça değil IP adresi ve port numasından oluşmuş bir yapıdır.
Bilgisayarlarımız üzerinde bir çok socket bulunur. Her socket tabanlı program için bilgisayar üzerinde ayrı port açılmıştır. Örneğin ftp sunucuları 21. portta, telnet ise 23. portta çalışmaktadır.
Yaptığımız program, client'ın server‘a gönderdiği TC no,vergi matrahı,vergi yılı,vergi tipi gibi string değerleri alıp, bunlardan vergi matrahı,vergi yılı,vergi tipi string değerlerini double'a çevirdikten sonra vergi miktarını hesaplıyor.Hesaplanan vergi miktarı double bir değer olduğundan vergi miktarını stringe çevirip client'a dönüyor.Burada karşımıza client ve server terimleri çıktı. Bu iki kavramdan da kısa bir şekilde bahsedelim;
Client’ı socket programlarda hizmet isteyen istemci olarak adlandırabiliriz. İstediği zaman server’a bağlanıp istekte bulunur ve serverdan dönen cevabı alır. Yine istediği zaman bağlantıyı koparabilir.
Server da bu durumda socket programlarda hizmet veren sunucu oluyor. Client istediği zaman sunucuya bağlanabileceği için serverın sürekli açık olup, Clientın bağlanacağı portu dinliyor olması gerekmektedir.
socket = new Socket (“localhost”,5555) olarak yazmamın sebebi projemi localde çalıştırıyor olmamdır. Yine localhost yerine 127.0.0.1 de yazabilirdik. Ama bu kısıma bağlanmak istediğimiz bilgisayarın (yani serverın) IP adresini yazabilirsiniz.
Server 5555 portunu client’ ın bağlanması için dinliyor. Port açarken dikkat etmemiz gereken önemli bir konuda portun 1 ile 1024 arasında olmamasıdır. Çünkü bu değer aralıklarındaki portlar spesifik portlardır ve root tarafından kullanılır. Eğer 1-1024 arasında bir portu kullanmaya çalışırsak programımız “bind permission” hatası verecektir.
Client'ta kullanıcıdan veri almak için BufferedReader sınıfını kullanıyoruz.
Ayrıca Server'da client'tan gelen verileri dosyaya yazdırıyoruz.
İstemci kısmı kodları:
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
String tcNo;
String vergiMatrah,vergiYılı,vergiTipi;
try {
socket = new Socket("localhost", 5555); // "localhost" ya da sunucu IP adresi
// input stream ve output stream oluşturuluyor...
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Sunucu bulunamadı");
System.exit(1);
} catch (IOException e) {
System.err.println("I/O exception:" + e.getMessage());
System.exit(1);
}
System.out.println("Sunucuya baglanildi.");
// klavyeden girdi: stdIn
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
System.out.println("TC Kimlik no giriniz:");
tcNo = stdIn.readLine();
out.println("TC kimlik no:");
out.println(tcNo);
System.out.println("Vergi matrahı giriniz:");
vergiMatrah =stdIn.readLine();
out.println("Vergi Matrahi:");
out.println(vergiMatrah);
System.out.println("Vergi yılını giriniz:");
vergiYılı =stdIn.readLine();
out.println("Vergi Yili:");
out.println(vergiYılı);
System.out.println("Vergi tipini giriniz:");
System.out.println("Lütfen vergi tipini seçiniz:");
System.out.println("1-Taşıt");
System.out.println("2-Emlak");
System.out.println("3-Özel Tüketim");
System.out.println("4-Gümrük");
vergiTipi =stdIn.readLine();
out.println("Vergi Tipi:");
if(Integer.parseInt(vergiTipi)>4){
System.out.println("Lütfen 1 ile 4 arasında bir değer giriniz:");
out.println(0);
out.println("");
}
out.println(vergiTipi);
out.println("");
System.out.println("Vergi miktarı: " + in.readLine());
System.out.println("Baglanti kesiliyor...");
out.close();
in.close();
stdIn.close();
socket.close();
}
}
Sunucu kısmı kodları:
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
public class Server {
public static void main(String[] args) throws IOException {
String tcNo ;
String vergiMatrah ,vergiYılı ,vergiTipi = null;
double vergiMiktarı=0.0;
List<String> liste=new ArrayList<String>();
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(5555);
} catch (IOException e) {
System.err.println("I/O exception: " + e.getMessage());
System.exit(1);
}
System.out.println("");
System.out.println("Sunucu baslatildi. Baglanti bekleniyor...");
System.out.println("");
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept(); // bağlantı gelene kadar burada bekler
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
System.out.println(clientSocket.getLocalAddress() + " baglandi.");
System.out.println("");
// input stream ve output stream oluşturuluyor...
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String inputLine, outputLine;
System.out.println("İstemciden girdi bekleniyor...");
System.out.println("");
while (!(inputLine = in.readLine()).equals("")) { // istemciden gelen string okunuyor...
System.out.print( inputLine);
liste.add(inputLine);
if(liste.size()%2==0)
System.out.println("\n");
}
vergiMiktarı = (Double.parseDouble(liste.get(3)) *Double.parseDouble(liste.get(5))* Double.parseDouble(liste.get(7))) / (double)100000 ;
String v=String.valueOf(vergiMiktarı);
out.println(v);
//dosyaya yazma
try {
FileWriter dosyaYazıcı = new FileWriter("C:\\Users\\User\\workspace\\SocketExample\\bin\\test.txt");
BufferedWriter dosyaOutput = new BufferedWriter(dosyaYazıcı);
for(int i=0;i<liste.size();i++){
dosyaOutput.write(liste.get(i));
if(i%2==1)
dosyaOutput.newLine();
}
dosyaOutput.write("Vergi miktari:");
dosyaOutput.write(v);
dosyaOutput.close();
dosyaYazıcı.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("Hata: " + e.getMessage());
}
System.out.println(clientSocket.getLocalSocketAddress() + " baglantisi kesildi.");
// stream ve socketleri kapat.
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
0 Yorumlar:
Yorum Gönder