Monday, July 29, 2019

Socket Anlayışı. TCP app vasitəsi ilə Mesaj və Binary File göndərmək

Java Socket proqramlaşdırma

Java socket proqramlaşdırmadan əvvəl “socket” anlayışını araşdıraq. Socket deyildikdə ilk ağlımıza kompüterin sistem blokunda olan bir parça gəlir

Ancaq socket kompüterin  şəbəkə  üzərinden başqa kompüterlər ilə məlumat mübadiləsini təmin edən bir quruluşdur.Şübhəsiz ki, bunu həyata keçirmək üçün bəzi adreslərə ehtiyacımız var. Bunlardan biri bizim kompüterimizin İP adresidir.





 


IP adresi hansı kompüter ile mübadiləyə girəcəyimizi təyin etməyə köməklik edir. Xəbərləşəcəyimiz kompüterə gedib çatdıqda bunu hansı program vasitəsi ilə həyata keçirəcəyimizi bildirmək gərəkdir.Tam bu əsnada kompüterimizin portları bizə yardımçı olacaq

Bu o deməkdir ki; iki kompüter IP adresi ve Port sayəsinde xəbərləşir. Socket dediyimiz quruluş isə bəhs etdiyimiz IP adresi ve Port təşkil olunmuşdur. Yəni socket herkesin zehninə qazınmış hardware hissəsi deyildir; IP adresi ve Port nömrələrindən əmələ gəlmiş bir quruluşdur. 

Kompüterimiz üzərindən birdən çox socket vardır. Hər socket yönümlü program üçün kompüterimizdə  fərqli  portlar mövcuddur. Nümunə üçün, FTP Serveri  21. Port, TELNET Serverləri ise 23. Portda işləyir.  

Socket anlayışına qısaca toxunduq, indi isə Socket Programlaşdırmaya keçə bilərik. 2 fərqli program nümunəsi təqdim edəcəyik.Birinci nümunədə Client Serverə mesaj göndərir(Scanner vasitəsilə) və Server bunu ekrana yazdırır. İkinci nümunəmiz isə daha biraz qarışıqdır. Belə ki, Bir PDF formatlı faylı Clientdən Serverə göndərəcəyik. Əvvəla, ClientServer nədir?

Client , socket programlarda xidmət istəyən bir presessordur(virtual olaraq). İstədiyində serverə qoşulub əmrlər göndərir və geriyə dönən  cavabı alır ve yene istədiyində  bağlantını kəsə bilir. Daha qısa desək Client göndərən tərəfdir

Server isə, socket programlarda xidmət verən prosessordur. Client serverə qoşulmaq istəyən zaman, qoşula bilməsi için serverın daima açıq olub, Clientin qoşulacağı  portu izləməsi gərəkdir.


Clientin serverə qoşula bilməsi üçün  serverdə açılan portu dinləməsi gərəkdir. Buna görə də ilk olaraq, Serveri işə salmaq lazımdır 

Proyekt 1: Socket vasitəsi ilə Mesaj göndərilməsi 

Client kodu:


package tcp.client;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket; //Java-da Socketləri işə salmaq üçün  java.net package-i import edilməlidir
import java.util.Scanner;


public class TCPClient {

    
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        Socket mySocket = new Socket("localhost",1111);  // localhost - adresin öz kompüterim olduğunu göstərir
        DataOutputStream dat = new DataOutputStream(mySocket.getOutputStream());
        Scanner sc = new Scanner(System.in);
        String send = sc.nextLine();
        dat.writeBytes(send);
        mySocket.close();
        
        
        
        
    }
    
} 

Server Kodu:


package tcp.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

   
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        ServerSocket serverSocket = new ServerSocket(1111); //Xüsusən Server Socket üçün etdik Bunu
        while(true) //Yuxarıda qeyd etmişdik ki, Server Daima açıq olmalıdır
        {
            Socket mySocket = serverSocket.accept();
            InputStreamReader isr = new InputStreamReader(mySocket.getInputStream());
            BufferedReader  bw = new BufferedReader(isr);
            String myText = bw.readLine();
            System.out.println("You've read: "+myText);
            
            
        }
    }
    
}

Proyekt 2: Socket vasitəsi ilə PDF göndərilməsi 

Bu nümunədə biz bir pdf faylı Client-dən Server-ə göndərəcəyik. Burda Məqsəd tək PDF faylı deyil istənilən nön faylın göndərilməsidir. Yuxarıdakından fərqi isə bu səfər Character Based yox Byte Based sistemlə işləyəcəyik
Client kodu:
 
import java.io.*;
import java.net.*;
import java.util.*;
public class Client {
    public static void main(String[] args) throws Exception
    {
        Socket mySocket = new Socket("localhost",6789);
        DataOutputStream dat = new DataOutputStream(mySocket.getOutputStream());
        Scanner sc = new Scanner(System.in);
        String path = sc.nextLine();
        byte[] bytes = readFromFile(path);
        dat.write(bytes);
        dat.close();



    }
    public static byte[] readFromFile(String pathName)
    {
        byte[] bytes = null;
        try(InputStream in = new FileInputStream(pathName))
        {
            File file = new File(pathName);
            bytes = new byte[(int)file.length()];
            in.read(bytes);

        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        return bytes;
    }
}
Server
import java.io.*;
import java.net.*;
public class Server
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket connectionSocket = new ServerSocket(6789);
        while(true)
        {
            Socket mySocket = connectionSocket.accept();
            InputStream in = mySocket.getInputStream();
            OutputStream out = new FileOutputStream("/home/user/Desktop/huhuh.pdf");
            byte[] buffer = new  byte[2000];
            int read = 0;
            while((read=in.read())!=-1)
            {
                out.write(read);
            }
            out.flush();
            out.close();
            System.out.println("Done!");


        }
    }
}