Nalika kita ngomong babagan jaringan, kita ora bisa gagal nyebutake model OSI.

Ing istilah model iki, dina iki kita paling kasengsem ing lapisan transportasi (4).

Iki minangka level ing ngendi kita nggarap data sing obah "saka titik A menyang titik B". Tugas utama lapisan transportasi yaiku kanggo mesthekake yen pesen dikirim menyang panggonan sing dituju, nalika njaga urutan sing bener. Rong protokol lapisan transport sing paling umum yaiku: TCP lan UDP. Dheweke kerja kanthi konsep kanthi cara sing beda-beda, nanging saben duwe kaluwihan dhewe sing ngidini dheweke bisa ngatasi masalah tartamtu.

Pisanan, ayo goleki cara kerja TCP.

TCP (Transmission Control Protocol) minangka protokol jaringan sing njamin sambungan antarane host digawe sadurunge data diijolke.

Iki minangka protokol sing bisa dipercaya, amarga saben ngirim paket data liyane, kudu mriksa manawa paket sadurunge ditampa.

Paket sing ditularake dipesen, lan yen ana masalah karo paket tartamtu (yaiku pihak sing nampa ora konfirmasi yen paket wis teka), banjur paket kasebut dikirim maneh. Akibaté, tingkat transfer relatif kurang, amarga luwih akeh wektu dibutuhake kanggo ngawasi sing ketat lan kanggo mesthekake pesenan sing bener.

Iki minangka "sedulur", protokol UDP. Ora kaya TCP, UDP ora peduli karo urutan lan status saben paket. Iku mung ngirim data tanpa konfirmasi pangiriman. Apa maneh, iku ora nggawe sambungan lan ora gumantung ing status sambungan ing sembarang cara.

Tujuane mung kanggo ngirim data menyang alamat. Lan iki nyebabake kerugian utama protokol, linuwih sithik, amarga bisa ilang data. Kajaba iku, panampa kudu disiapake kanggo kasunyatan manawa data kasebut bisa kedadeyan. Sing jarene, protokol uga duwe kaluwihan, tingkat transfer sing luwih dhuwur, amarga protokol kasebut diwatesi kanggo ngirim data.

Ana uga beda-beda babagan carane data kasebut ditularake. Ing TCP, data dialirake, tegese data kasebut ora ana watese. Ing UDP, data dikirim minangka datagrams lan duwe wates, lan panampa mriksa integritas data, nanging mung yen pesen kasebut kasil ditampa.

Ayo ngringkes:

TCP minangka protokol sing dipercaya lan akurat sing nyegah mundhut data. Pesen mesthi bakal dikirim kanthi akurasi maksimal, utawa ora dikirim. Panampa ora mbutuhake logika kanggo pesen data, amarga data sing mlebu bakal diurutake. UDP ora dipercaya, nanging minangka protokol transfer data sing luwih cepet. Pihak sing ngirim lan nampa mbutuhake sawetara logika tambahan supaya bisa nganggo protokol iki. Nanging ayo dipikirake cara kerjane nggunakake conto game komputer utawa game seluler sing dimainake liwat jaringan. Kita bisa maneh Care babagan apa sing kudu teka 5 detik kepungkur, lan kita bisa nglumpati saperangan saka paket yen padha ora teka ing wektu - game bisa lag, nanging sampeyan isih bisa muter!

Ing Jawa, kanggo nggarap datagram sing dikirim liwat UDP, kita nggunakake obyek saka kelas DatagramSocket lan DatagramPacket .

Kanggo ijol-ijolan data, pangirim lan panrima nggawe soket datagram, yaiku conto kelas DatagramSocket . Kelas kasebut duwe sawetara konstruktor. Bentenane ing antarane yaiku ing ngendi soket sing digawe bakal nyambung:

DatagramSocket () Nyambung menyang sembarang port kasedhiya ing mesin lokal
DatagramSocket (port int) Nyambung menyang port kasebut ing mesin lokal
DatagramSocket(int port, InetAddress addr) Nyambung menyang port sing ditemtokake ing alamat ing mesin lokal (addr)

Kelas kasebut ngemot akeh cara kanggo ngakses lan ngatur paramèter soket (bakal katon mengko), uga cara kanggo nampa lan ngirim datagram:

kirim (Paket Datagram) Ngirim datagrams dikemas menyang paket
nampa (paket DatagramPacket) Nampa datagrams dikempalken menyang paket

DatagramPacket minangka kelas sing makili paket datagram. Paket datagram digunakake kanggo ngetrapake layanan pangiriman paket tanpa sambungan. Saben pesen dialihake saka siji mesin menyang mesin liyane adhedhasar informasi sing ana ing paket kasebut. Sawetara paket sing dikirim saka siji mesin menyang mesin liyane bisa diarahake kanthi cara sing beda lan bisa teka kanthi urutan apa wae. Pangiriman paket ora dijamin.

Konstruktor:

Paket Datagram(byte[] buf, panjang int) Nggawe DatagramPacket kanggo nampa paket sing dawane dawa .
Paket Datagram(byte[] buf, panjang int, alamat InetAddress, port int) Nggawe paket datagram kanggo ngirim paket kanthi dawa menyang nomer port sing ditemtokake ing host sing ditemtokake.
Paket Datagram(byte[] buf, int offset, int length) Nggawe DatagramPacket kanggo nampa paket sing dawane dawa , nemtokake offset ing buffer.
Paket Datagram(byte[] buf, int offset, int length, alamat InetAddress, int port) Nggawe paket datagram kanggo ngirim paket kanthi dawa kanthi offset menyang nomer port sing ditemtokake ing host sing ditemtokake.
Paket Datagram(byte[] buf, int offset, int length, alamat SocketAddress) Nggawe paket datagram kanggo ngirim paket kanthi dawa kanthi offset menyang nomer port sing ditemtokake ing host sing ditemtokake.
Paket Datagram(byte[] buf, panjang int, alamat SocketAddress) Nggawe paket datagram kanggo ngirim paket kanthi dawa menyang nomer port sing ditemtokake ing host sing ditemtokake.

Kita kelingan manawa pendekatan UDP ora nggawe sambungan. Paket dikirim kanthi pangarep-arep sing ditampa dening panampa. Nanging sampeyan bisa nggawe sambungan nggunakake cara connect (InetAddress addr, int port) saka kelas DatagramSocket .

Sambungan siji arah ditetepake karo host adhedhasar alamat lan port: kanggo ngirim utawa nampa datagram. Sambungan bisa mungkasi nggunakake medhot () cara.

Ayo nyoba nulis kode server adhedhasar DatagramSocket kanggo nampa data:


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

class Recipient {

   public static void main(String[] args) {
       try {
           DatagramSocket ds = new DatagramSocket(1050);

           while (true) {
               DatagramPacket pack = new DatagramPacket(new byte[5], 5);
               ds.receive(pack);
               System.out.println(new String(pack.getData()));
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}

Kita nggawe obyek DatagramSocket kanggo ngrungokake ing port 1050. Nalika nampa pesen, prints menyang console. Kita bakal ngirim tembung "Hello", supaya kita matesi ukuran buffer kanggo limang bita.

Saiki kita bakal nggawe kelas pangirim:


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

class Sender {
   private String host;
   private int port;

   Sender(String host, int port) {
       this.host = host;
       this.port = port;
   }

   private void sendMessage(String mes) {
       try {
           byte[] data = mes.getBytes();
           InetAddress address = InetAddress.getByName(host);
           DatagramPacket pack = new DatagramPacket(data, data.length, address, port);
           DatagramSocket ds = new DatagramSocket();
           ds.send(pack);
           ds.close();
       } catch (IOException e) {
           System.err.println(e);
       }
   }

   public static void main(String[] args) {
   Sender sender = new Sender("localhost", 1050);
   String message = "Hello";

   Timer timer = new Timer();
   timer.scheduleAtFixedRate(new TimerTask() {
       @Override
       public void run() {
           sender.sendMessage(message);
       }
   }, 1000, 1000);
}

}

Ing metode sendMessage , kita nggawe DatagramPacket lan DatagramSocket , lan ngirim pesen. Elinga yen cara cedhak () digunakake kanggo nutup DatagramSocket sawise pesen dikirim.

Saben detik console panampa nampilake pesen "Hello" sing dikirim dening pangirim. Iki tegese komunikasi kita kabeh bisa digunakake kanthi bener.