Soket UDP

Modul 2: Teras Java
Tahap , pelajaran
Tersedia

Apabila kita bercakap tentang rangkaian, kita tidak boleh gagal untuk menyebut model OSI.

Dari segi model ini, hari ini kami paling berminat dengan lapisan pengangkutan (4).

Ini ialah tahap di mana kami bekerja dengan data bergerak "dari titik A ke titik B". Tugas utama lapisan pengangkutan adalah untuk memastikan mesej dihantar ke destinasi, sambil mengekalkan urutan yang betul. Dua protokol lapisan pengangkutan yang paling biasa ialah: TCP dan UDP. Mereka bekerja secara konsep dengan cara yang berbeza, tetapi masing-masing mempunyai kelebihan tersendiri yang membolehkan mereka menyelesaikan masalah tertentu.

Mula-mula, mari kita lihat cara TCP berfungsi.

TCP (Transmission Control Protocol) ialah protokol rangkaian yang memastikan bahawa sambungan antara hos diwujudkan sebelum data ditukar.

Ini adalah protokol yang sangat dipercayai, kerana setiap kali ia menghantar paket data lain, ia mesti menyemak bahawa paket sebelumnya telah diterima.

Paket yang dihantar ditempah, dan jika terdapat masalah dengan paket tertentu (iaitu pihak yang menerima tidak mengesahkan bahawa paket telah tiba), maka paket itu dihantar semula. Akibatnya, kadar pemindahan agak rendah, kerana lebih banyak masa diperlukan untuk pemantauan yang ketat dan untuk memastikan pesanan yang betul.

Di sinilah "saudaranya", protokol UDP, masuk. Tidak seperti TCP, UDP tidak begitu mengambil berat tentang susunan dan status setiap paket. Ia hanya menghantar data tanpa pengesahan penghantaran. Lebih-lebih lagi, ia tidak mewujudkan sambungan dan tidak bergantung pada status sambungan dalam apa jua cara.

Tujuannya hanyalah untuk menghantar data ke alamat. Dan ini menimbulkan kelemahan utama protokol, kebolehpercayaan yang rendah, kerana ia hanya boleh kehilangan kepingan data. Selain itu, penerima mesti bersedia untuk fakta bahawa data mungkin tiba dalam keadaan tidak teratur. Yang berkata, protokol itu juga mempunyai kelebihan, kadar pemindahan yang lebih tinggi, kerana fakta bahawa protokol itu terhad kepada penghantaran data.

Terdapat juga perbezaan dalam cara data itu sendiri dihantar. Dalam TCP, data distrim, yang bermaksud bahawa data tidak mempunyai sempadan. Dalam UDP, data dihantar sebagai datagram dan mempunyai sempadan, dan penerima menyemak integriti data, tetapi hanya jika mesej berjaya diterima.

Mari kita ringkaskan:

TCP ialah protokol yang boleh dipercayai dan tepat yang menghalang kehilangan data. Mesej akan sentiasa dihantar dengan ketepatan maksimum, atau tidak dihantar sama sekali. Penerima tidak memerlukan logik untuk memesan data, kerana data masuk sudah pun dipesan. UDP tidak boleh dipercayai, tetapi ia adalah protokol pemindahan data yang lebih pantas. Pihak penghantar dan penerima memerlukan beberapa logik tambahan untuk berfungsi dengan protokol ini. Tetapi mari kita lihat cara ia berfungsi menggunakan contoh permainan komputer atau permainan mudah alih yang dimainkan melalui rangkaian. Kami mungkin tidak lagi mengambil berat tentang perkara yang sepatutnya tiba 5 saat yang lalu, dan kami boleh melangkau beberapa paket jika ia tidak tiba tepat pada masanya — permainan mungkin ketinggalan, tetapi anda masih boleh bermain!

Di Java, untuk bekerja dengan datagram yang dihantar melalui UDP, kami menggunakan objek kelas DatagramSocket dan DatagramPacket .

Untuk menukar data, penghantar dan penerima mencipta soket datagram, iaitu contoh kelas DatagramSocket . Kelas ini mempunyai beberapa pembina. Perbezaan di antara mereka adalah tempat soket yang dibuat akan disambungkan:

DatagramSocket () Menyambung ke mana-mana port yang tersedia pada mesin tempatan
DatagramSocket (port int) Menyambung ke port yang ditentukan pada mesin tempatan
DatagramSocket(port int, addr InetAddress) Menyambung ke port yang ditentukan pada alamat pada mesin tempatan (addr)

Kelas mengandungi banyak kaedah untuk mengakses dan mengurus parameter soket (kita akan melihatnya sedikit kemudian), serta kaedah untuk menerima dan menghantar datagram:

hantar (pek DatagramPacket) Menghantar datagram yang dibungkus ke dalam paket
terima (pek DatagramPacket) Menerima datagram yang dibungkus ke dalam paket

DatagramPacket ialah kelas yang mewakili pakej datagram. Paket datagram digunakan untuk melaksanakan perkhidmatan penghantaran paket tanpa sambungan. Setiap mesej dialihkan dari satu mesin ke mesin yang lain berdasarkan maklumat yang terkandung dalam paket itu semata-mata. Berbilang paket yang dihantar dari satu mesin ke mesin lain mungkin dialihkan secara berbeza dan mungkin tiba dalam sebarang pesanan. Penghantaran paket tidak dijamin.

Pembina:

DatagramPacket(bait[] buf, panjang int) Mencipta DatagramPacket untuk menerima paket yang panjangnya .
DatagramPacket(bait[] buf, panjang int, alamat InetAddress, port int) Mencipta paket datagram untuk menghantar paket panjang ke nombor port yang ditentukan pada hos yang ditentukan.
DatagramPacket(bait[] buf, int ofset, int length) Mencipta DatagramPacket untuk menerima paket dengan panjang panjang , menyatakan offset dalam penimbal.
DatagramPacket(bait[] buf, int offset, int length, alamat InetAddress, int port) Mencipta paket datagram untuk menghantar paket panjang dengan mengimbangi offset kepada nombor port yang ditentukan pada hos yang ditentukan.
DatagramPacket(bait[] buf, int offset, int length, alamat SocketAddress) Mencipta paket datagram untuk menghantar paket panjang dengan mengimbangi offset kepada nombor port yang ditentukan pada hos yang ditentukan.
DatagramPacket(bait[] buf, panjang int, alamat SocketAddress) Mencipta paket datagram untuk menghantar paket panjang ke nombor port yang ditentukan pada hos yang ditentukan.

Kami ingat bahawa pendekatan UDP tidak mewujudkan sambungan. Paket dihantar dengan harapan bahawa penerima mengharapkannya. Tetapi anda boleh membuat sambungan menggunakan kaedah connect(InetAddress addr, int port) kelas DatagramSocket .

Sambungan sehala diwujudkan dengan hos berdasarkan alamat dan port: sama ada untuk menghantar atau menerima datagram. Sambungan boleh ditamatkan menggunakan kaedah disconnect() .

Mari cuba tulis kod pelayan berdasarkan DatagramSocket untuk menerima 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();
       }
   }
}

Kami mencipta objek DatagramSocket untuk mendengar pada port 1050. Apabila ia menerima mesej, ia mencetaknya ke konsol. Kami akan menghantar perkataan "Hello", jadi kami mengehadkan saiz penimbal kepada lima bait.

Sekarang kita akan mencipta kelas penghantar:


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);
}

}

Dalam kaedah sendMessage , kami mencipta DatagramPacket dan DatagramSocket , dan menghantar mesej kami. Ambil perhatian bahawa kaedah close() digunakan untuk menutup DatagramSocket selepas mesej dihantar.

Setiap saat konsol penerima memaparkan mesej "Hello" masuk yang dihantar oleh pengirim. Ini bermakna komunikasi kita semua berfungsi dengan betul.

Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION