Kamis, 13 Oktober 2011

Pemrograman Java / Client Server

Pada tahun 1990-an, tren itu bergerak menjauh dari komputasi Mainframe untuk Client / Server, karena harga server Unix turun. Akses database dan beberapa logika bisnis yang terpusat di back-end server, mengumpulkan data dari program pengguna telah diinstal di front-end pengguna "klien" 'komputer. Dalam dunia Java ada tiga cara utama front-end dan back-end hanya bisa berkomunikasi.
  • Aplikasi klien menggunakan JDBC untuk menghubungkan server basis data, (logika bisnis Limited pada back-end, kecuali menggunakan (prosedur tersimpan )
  • Aplikasi klien menggunakan RMI ( Doa remote method ) untuk berkomunikasi dengan back-end.
  • Aplikasi klien menggunakan koneksi soket untuk berkomunikasi dengan back-end.           
  • Contoh Socket Connection

  • Gambar 1: Klien Implementasi Server Sederhana
    Pada halaman ini ada contoh untuk koneksi soket.

     Membuat Server

    Bahasa Java dikembangkan memiliki jaringan komputasi dalam pikiran. Untuk alasan ini sangat mudah untuk membuat sebuah program server. Sebuah server adalah bagian dari kode yang berjalan sepanjang waktu mendengarkan pada port tertentu pada komputer untuk permintaan yang masuk. Ketika permintaan datang, itu mulai thread baru untuk melayani request. Lihat contoh berikut:

    Mendengarkan pada port

    ComServer
    kelas untuk mendengarkan pada port untuk klien.
     java.net.ServerSocket impor;
     / ** 
       * - Kelas Server Utama; Mendengarkan pada port untuk klien; Jika ada klien, 
       * Thread baru memulai dan kembali untuk mendengarkan lebih lanjut untuk klien.  - 
       * /
     masyarakat kelas ComServer 
     {
     statis boolean GL_listening = true;
        / ** 
          * - Program Utama untuk memulai Server - 
          * /
        public void main statis (String [] args) throws IOException
        {
           ComServer srv = new ComServer ();
           . srv mendengarkan (); 
        } / / --- End --- Metode Utama
     
        / ** 
          * - Server metode; Dengarkan klien - 
          * /
        public int mendengarkan () throws IOException
        {
         ServerSocket ServerSocket = null;
         int iPortNumber = 9090;
     
            / / --- Buka Socket Server dimana harus mendengarkan ---
            try {
                Sistem keluar println.. ("*** Buka soket mendengarkan; di:" + + iPortNumber "***");
                ServerSocket = new ServerSocket (iPortNumber);
            } Catch (IOException e) {
                . Sistem err println ("Tidak dapat mendengarkan pada port:" + iPortNumber).;
                . Sistem exit (1);
            }
            sementara (GL_listening)
            {
             ComServerThread clientServ; 
                / / --- Mendengarkan klien; Jika ada klien memulai Thread -
                Sistem keluar println.. ("*** Dengarkan Klien; di:" + + iPortNumber "***");
                clientServ = baru ComServerThread (serverSocket. menerima ());
                / / --- Layanan Klien ---
                Sistem keluar println.. ("*** Klien datang; Layanan itu ***");
                . clientServ start (); / * --- Gunakan untuk multy Threaded --- * /
           / / ClientServ.run (); / * --- Gunakan untuk Single Threaded --- * /
            }
     
            / / --- Tutup soket Server; Server keluar ---
            . ServerSocket close ();
         return 0;
        } / / --- Akhir mendengarkan Metode ---
     } / / --- Akhir Kelas ComServer ---
    ServerSocket (iPortNumber)
    Membuat server socket, terikat pada port tertentu.
    serverSocket.accept ()
    Mendengarkan untuk koneksi yang akan dibuat untuk socket ini dan menerimanya. Metode blok sampai sambungan dibuat. Ia mengembalikan Socket baru.

      Layanan Satu Klien

    ComServerThread
    Kelas ini diperpanjang dari Thread; Bertanggung jawab untuk layanan satu klien. Sambungan Socket akan terbuka antara klien dan server. Sebuah protokol sederhana harus didefinisikan antara klien dan server, server harus memahami apa yang diinginkan klien dari server. Klien akan mengirim 'menghentikan' perintah, yang server akan mengakhiri koneksi soket. Kelas ComServerThread bertanggung jawab untuk menangani permintaan klien, sampai client mengirimkan sebuah 'menghentikan' perintah.
      / ** 
        * - Sebuah kelas diperpanjang dari Thread; Bertanggung jawab untuk layanan satu klien - 
        * /
      kelas'''ComServerThread'''extends Thread
      {
         swasta Socket clientSocket = null;
         COM_DATA tDataFromClient;
         COM_DATA tDataToClient; 
         ObjectInputStream Oin;
         ObjectOutputStream oOut;
         / ** 
           * - Pembuat - 
           * /
         publik ComServerThread (Socket socket)
         {
            super ("ComServerThread");
            ini clientSocket = soket;.
         } / / - Akhir dari ComServerThread () konstruktor -
         / ** 
           * - Overrun dari Thread (super) kelas - 
           * /
         public {{java: void}} run ()
         {
            try {
               / / --- Buat Writer; akan digunakan untuk mengirim data ke klien ---
               oOut = new ObjectOutputStream (clientSocket. getOutputStream ());
               / / --- Buat Reader, akan digunakan untuk mendapatkan data dari klien ---
               Oin = new ObjectInputStream (clientSocket. getInputStream ());
               / / --- Buat objek protokol baru ---
               ComProtocol comp = baru ComProtocol ();
               / / --- Kirim sesuatu untuk klien untuk menunjukkan server yang siap ---
               tDataToClient ='''comp.processInput (null);'''
               '''SendDataToClient'''(tDataToClient, oOut);
               / / --- Dapatkan data dari klien ---
               sementara (benar)
               {
                  try {
                     tDataFromClient ='''getDataFromClient (Oin)''';
                     / / --- Parse permintaan dan mendapatkan balasan ---
                     tDataToClient ='''comp.processInput (tDataFromClient);'''
                     / / --- Mengirim data ke Klien ---
                     '''SendDataToClient'''(tDataToClient, oOut);
                  }
                  catch (EOFException e) {
                     .. Sistem keluar println ("Klien Terputus, Bye, Bye");
                     break;
                  }
                  / / --- Lihat jika Klien ingin mengakhiri sambungan ---
                  jika (tDataToClient. bExit)
                  {
                     .. Sistem keluar println ("Klien kata Bye Bye.");
                     break;
                  }
               }
               / / --- Sumber daya Tutup; Klien ini hilang ---
               . comp Akhir ();
               oOut close ().;
               . Oin close ();
               . clientSocket close ();
            } Catch (IOException e) {
             e. printStackTrace ();
            }
         } / / - Akhir dari run () Metode -
         / ** 
           * Dapatkan data dari Klien  
           * /
         COM_DATA private static'''getDataFromClient'''(ObjectInputStream Oin) throws IOException                                                                         
         {
             COM_DATA tDataFromClient = null;         
             / / Inisialisasi variabel --- ---
             / / TDataFromClient = baru COM_DATA ();
             sementara (tDataFromClient == null)
             {
                try {
                   / / --- Baca Nomor Baris pertama -
                   tDataFromClient = (COM_DATA) Oin readObject ().;
                } Catch (ClassNotFoundException e) {
                    .. Sistem keluar println ("ClassNotFound");
                }
             }
             Sistem keluar println ("Dapatkan:". + TDataFromClient comData)..;
          kembali tDataFromClient;
         } / / --- GetDataFromClient () Metode ---
         / ** 
           * Mengirim data ke Klien  
           * /
         private void static'''sendDataToClient'''(COM_DATA tDataToClient,
                                                ObjectOutputStream oOut) throws IOException
         {         
             Sistem keluar println ("Terkirim:". + TDataToClient comData)..;
             oOut writeObject (tDataToClient).;
           kembali;
         } / / - Akhir dari sendDataToClient () Metode -
      } / / --- End kelas ComServerThread ---
    COM_DATA tDataFromClient
    Variabel ini akan berisi objek data dari klien.
    COM_DATA tDataToClient
    Variabel ini akan berisi objek data yang akan dikirim ke klien.
    sendDataToClient
    Metode ini mengirimkan objek data ke klien.
    getDataFromClient
    Metode ini mendapatkan objek data dari klien.
    processInput (tDataFromClient)
    Metode dari kelas 'ComProtocol' menafsirkan perintah klien dan mengembalikan objek data yang akan dikirim kembali ke klien.

      Penanganan permintaan; mengimplementasikan protokol komunikasi

    ComProtocol
    Kelas ini mengimplementasikan, dan merangkum logika komunikasi (protokol). Protokol adalah sebagai berikut:
    1. Klien memulai koneksi.
    2. Server menerima dan mengirim pengakuan memberitahu bahwa itu siap
    3. Client mengirimkan permintaan
    4. Respon server berdasarkan permintaan
    ...
    1. Klien mengirimkan 'DAH' permintaan
    2. Server mengakui 'Bye' permintaan dan memutuskan koneksi soket
    3. Klien mendapat pengakuan ke 'DAH'
    ...
    1. Klien mengirimkan 'SHUTDOWN' permintaan
    2. Server mengakui 'SHUTDOWN' permintaan dan memutus dan juga berhenti mendengarkan klien lain.
    3. Klien mendapat pengakuan ke 'shutdown'
     class ComProtocol { private static final int COM_STATUS_WAITING = 0; private static final int COM_STATUS_READY_SENT = 1; private static final int COM_STATUS_DATA_SENT = 2; private static final int COM_STATUS_WAITING_FOR_TERMINALID = 3; private int negara = COM_STATUS_WAITING; / / --- Referensi untuk 'KEMBALI -END 'mqTe modul --- swasta MqTeAccess; ...  / ** * Buat objek protokol; Panggil fungsi MQ INI * / public ComProtocol () { int IRET = 0; modul / / --- Inisialisasi 'BACK-END' --- mqTe.  ...  ...  } / ** * --- Proses Input dan Buat output ke Klien --- * / public COM_DATA processInput (COM_DATA theInput) {COM_DATA theOutput; / / Inisialisasi Variabel --- --- theOutput = new COM_DATA () ; / / --- Periksa apakah Klien ingin melepaskan --- if (theInput = null!) { if (theInput.comData.equals ("BYE @.!")) {/ / --- Klien ingin mengakhiri; Echo data kembali ke klien theOutput.comData = "BYE."; / / --- Tandai comunication yang akan diakhiri --- theOutput.bExit = true; / / --- Mengatur keadaan internal untuk menunggu baru klien --- negara = COM_STATUS_WAITING; / / --- Kembali data objek yang akan dikirim ke klien --- theOutput kembali;} if (theInput.comData.equals (".! SHUTDOWN @")) {/ / - - Klien ingin untuk mengakhiri; Echo data kembali ke klien theOutput.comData =; / / --- Tandai comunication yang akan diakhiri --- theOutput.bExit = true; / / --- Katakan server untuk "BYE." berhenti mendengarkan untuk klien baru --- ComServer.GL_listening = false; / / --- Mengatur keadaan internal untuk menunggu sebuah negara --- klien baru COM_STATUS_WAITING =; / / --- Kembali data objek yang akan dikirim ke klien --- kembali theOutput;}} if (negara COM_STATUS_WAITING ==) {/ / --- Kirim Pesan siap untuk Klien --- theOutput.comData = "Siap:"; / / --- Mengatur keadaan internal siap; dan menunggu TerminalId --- negara = COM_STATUS_WAITING_FOR_TERMINALID;} else if (negara COM_STATUS_WAITING_FOR_TERMINALID ==) { int IRET; / / --- Dapatkan ID Terminal --- sTermId = theInput.comData; / / --- 'Panggil KEMBALI -END modul '...  --- MqTe.  ...  ...  / / --- Kirim Pesan siap dengan versi Server untuk klien --- theOutput.comData = "Siap; Server Versi 1.0:"; / / --- Set raedy keadaan internal, dan menunggu TerminalId --- negara = COM_STATUS_READY_SENT;} else if (negara COM_STATUS_READY_SENT ==) { int IRET; String sCommand = theInput.comData; 'BACK-END' / / --- Panggil modul ...  ...  / * ** --- Periksa apakah kita harus mendapatkan data Respon --- * / if (theInput.iRet == COM_DATA.NOWAIT_FOR_RESPONSE) {/ / - Mengatur Nilai output --- theOutput.iRet = IRET; theOutput. comData = "";} else {modul / / --- Panggil 'BACK-END' --- mqTe.  ...  / / --- Mengatur Nilai output --- theOutput.comData = mqTe.sResponseBuffer; theOutput.iRet = IRET;}} return theOutput;} / / --- End Metode processInput () ---} / / - - Akhir Definisi Kelas ComProtocol --- 

    Obyek Data yang melewati jaringan

    COM_DATA
    adalah struktur data kelas yang ditransmisikan melalui jaringan. Kelas berisi data saja.
     / **
      * COM_DATA struktur data 
      * /
     public class COM_DATA implements Serializable
     {
      public String comData;
      public boolean bExit;
      public int IRET;
        / **
         * --- Contants nilai dapat disahkan di dalam IRET untuk Server ---
         * /
        static final int WAIT_FOR_RESPONSE = 0;
        static final int NOWAIT_FOR_RESPONSE = 1;
       / **
        * Inisialisasi struktur data
        * /
       public COM_DATA ()
       {
          comData = "";
          bExit = false;
          IRET = 0;
       } / / - Akhir dari COM_DATA () Pembuat -   
       / **
        * Menyalin itu isinya 
        * /
       public void copy (COM_DATA tSrc)
       {
          this comData = tSrc.comData.;
          this bExit = tSrc.bExit.;
          this IRET = tSrc.iRet.;
        return ;
       } 
     } / / - Akhir dari kelas COM_DATA -

      Buat Klien

    Sebuah kode klien untuk server / layanan biasanya merupakan sebuah aplikasi API yang digunakan untuk antarmuka pengguna ke server. Dengan bantuan API klien pengguna aplikasi tidak harus tahu bagaimana untuk menghubungkan ke server untuk mendapatkan layanan.
    ComClient
    Kelas ini adalah API klien. Aplikasi ini menggunakan kelas ini untuk berkomunikasi dengan server.
    Berikut ini adalah kelas klien untuk server di atas:
     public class ComClient
     {
      private Socket comSocket;
      private ObjectOutputStream oOut;
      private ObjectInputStream Oin;
      private boolean IsItOpen = false;       
        / **
         * --- Socket Terbuka ---
         * /
        public void openCom ( String sServerName,
                             int iPortNumber) throws UnknownHostException,
                                                                  IOException  
        {
           try {
              / / --- Socket Terbuka untuk komunikasi ---
              comSocket = new Socket (sServerName, iPortNumber);     
              / / --- Dapatkan Stream untuk menulis permintaan untuk Server ---
              oOut = new ObjectOutputStream (comSocket.getOutputStream ());     
              / / --- Dapatkan Stream / / untuk membaca dari Server
              Oin = new ObjectInputStream (comSocket.getInputStream ());
              / / Set variabel --- Anggota internal yang terbuka --- Komunikasi
              IsItOpen = true ;
           } catch (java.net.UnknownHostException e) {
              System.out.println ("(openCom:) Tidak tahu tentang host:" + sServerName);
              IsItOpen = false ;
              melempar (e);                                         
           } catch (java.io.IOException e) {
              System.out.println ("(openCom:) Tidak bisa mendapatkan I / O untuk koneksi ke:" + sServerName);
              IsItOpen = false ;
              throw (e);         
           }               
        }
        / **
         * --- Periksa apakah Socket terbuka ---
         * /
        public boolean isItOpen ()
        {
          return IsItOpen;
        }     
        / **
         * --- Dapatkan data string dari Server ---
         * /
        public void getServerData (COM_DATA tServData) throws IOException
        {
            / / Inisialisasi Variabel --- ---
            tServData.comData = "";
            / / --- Dapatkan Respon dari Server ---              
            try {
               tServData.copy ((COM_DATA) oIn.readObject ());
            }   
            catch (ClassNotFoundException e) {
                System.out.println ("Kelas Tidak Ditemukan");
            } 
            System.out.println ("Server:" + tServData.comData);
            if (tServData.comData.equals ("BYE."))
            {
                tServData.bExit = true ;
            }        
         return ;
        }
        / **
         * --- Mengirim data ke server ---
         * /
        public void sendDataToServer (COM_DATA tServData) throws IOException
        {
            / / --- Kirim data string ---
            System.out.println ("Kirim:" + tServData.comData);
            oOut.writeObject (tServData);
         return ;
        } 
        / **
         * --- Socket Tutup --- 
         * /
        public void closeCom () throws IOException
        {
            oOut.close ();
            oIn.close ();
            comSocket.close ();     
            IsItOpen = false ;
        }    
     }
    getServerData (COM_DATA tServData)
    Metode ini membaca data dari server dan salinan nilai-nilai ke objek 'tServData'.
    sendDataToServer (COM_DATA tServData)
    Metode ini mengirimkan 'tServData' objek melalui jaringan ro server.
    oIn.readObject ()
    Metode ini mengembalikan objek data yang dikirim oleh server.
    oOut.writeObject (tServData)
    Metode ini mengirimkan objek data ke server.
     

Tidak ada komentar:

Posting Komentar