Soket, juga dikenal sebagai soket, adalah salah satu teknologi dasar untuk komunikasi jaringan komputer. Saat ini, sebagian besar perangkat lunak berbasis web, seperti browser, alat pesan instan dan bahkan unduhan P2P, diimplementasikan berdasarkan soket. Artikel ini akan memperkenalkan pemrograman soket berdasarkan TCP/IP dan cara menulis program klien/server.
Makanan penutup pra-makan malam
Sistem Input and Output (IO) UNIX mengikuti templat operasi seperti close-write-write-close. Sebelum proses pengguna melakukan operasi IO, ia perlu menelepon terbuka untuk menentukan dan mendapatkan izin agar file atau perangkat dioperasikan untuk dibaca atau ditulis. Setelah objek operasi IO dibuka, proses pengguna dapat melakukan satu atau lebih operasi baca atau tulis pada objek. Operasi Baca digunakan untuk membaca data dari objek operasi IO dan meneruskan data ke proses pengguna. Operasi tulis digunakan untuk meneruskan data (menulis) dalam proses pengguna ke objek operasi IO. Setelah semua operasi membaca dan menulis selesai, proses pengguna perlu menelepon dekat untuk memberi tahu sistem yang melengkapi penggunaan objek IO.
Ketika UNIX mulai mendukung Interprocess Communication (IPC), antarmuka IPC dirancang untuk mirip dengan antarmuka operasi file IO. Di UNIX, suatu proses akan memiliki satu set deskriptor IO yang dapat dibaca dan ditulis. Deskriptor IO dapat berupa file, perangkat, atau saluran komunikasi (soket soket). Deskriptor file terdiri dari tiga bagian: Membuat (pembukaan soket), membaca dan menulis data (menerima dan mengirim ke soket) dan menghancurkan (penutupan soket).
Dalam sistem UNIX, versi seperti BSD dari antarmuka IPC diimplementasikan sebagai lapisan di atas protokol TCP dan UDP. Tujuan pesan diwakili oleh alamat soket. Alamat soket adalah pengidentifikasi komunikasi yang terdiri dari alamat jaringan dan nomor port.
Operasi komunikasi antar proses membutuhkan sepasang soket. Komunikasi antar proses dilakukan dengan transmisi data antara satu soket dalam satu proses dan soket lain dalam proses lain. Ketika sebuah pesan dieksekusi dan dikirim, pesan antri di soket pada ujung pengiriman sampai protokol jaringan tingkat bawah mengirimkan pesan keluar. Ketika pesan mencapai soket di ujung penerima, itu juga akan berada dalam antrian sampai proses di ujung penerima menerima pesan.
Komunikasi TCP dan UDP
Mengenai pemrograman soket, kami memiliki dua protokol komunikasi untuk dipilih. Salah satunya adalah komunikasi datagram, yang lainnya adalah komunikasi stream.
Komunikasi datagram
Protokol Komunikasi Datagram adalah apa yang sering kita sebut UDP (Protokol Data Pengguna). UDP adalah protokol tanpa koneksi, yang berarti bahwa setiap kali kita mengirim datagram, kita perlu mengirim deskriptor soket mesin asli dan deskriptor soket penerima pada saat yang sama. Karena itu, kita perlu mengirim data tambahan setiap kali kita berkomunikasi.
Streaming komunikasi
Protokol komunikasi aliran, juga dikenal sebagai TCP (Transfer Control Protocol) juga disebut TCP (Transfer Control Protocol). Tidak seperti UDP, TCP adalah protokol berbasis koneksi. Sebelum menggunakan komunikasi aliran, kita harus membuat koneksi antara pasangan komunikasi soket. Salah satu soket berfungsi sebagai server untuk mendengarkan permintaan koneksi. Yang lain membuat permintaan koneksi sebagai klien. Setelah kedua soket membuat koneksi, mereka dapat mentransfer data dalam satu arah atau dua arah.
Setelah membaca ini, kami memiliki beberapa pertanyaan tentang apakah kami menggunakan UDP atau TCP untuk pemrograman soket. Pilihan pemrograman soket berdasarkan protokol mana yang didasarkan pada skenario aplikasi spesifik Anda tergantung pada program klien-server spesifik Anda. Di bawah ini kami menganalisis secara singkat perbedaan antara protokol TCP dan UDP, yang dapat membantu Anda lebih memilih mana yang akan digunakan.
Di UDP, setiap kali datagram dikirim, deskriptor soket mesin asli dan deskriptor soket penerima perlu disertakan. Karena TCP adalah protokol berbasis koneksi, koneksi perlu dibuat antara pasangan soket komunikasi sebelum komunikasi, sehingga akan ada pemrograman koneksi yang memakan waktu dalam protokol TCP.
Di UDP, data Datagram memiliki ukuran 64kB dalam ukuran. Tidak ada batasan seperti itu di TCP. Setelah pasangan soket komunikasi TCP membuat koneksi, komunikasi di antara mereka mirip dengan aliran IO, dan semua data akan dibaca dalam urutan yang diterima.
UDP adalah protokol yang tidak dapat diandalkan, dan datagram yang dikirim tidak harus diterima oleh soket penerima dalam urutan di mana mereka dikirim. Maka TCP adalah protokol yang andal. Urutan paket yang diterima oleh ujung penerima konsisten dengan urutan paket di ujung pengiriman.
Singkatnya, TCP cocok untuk layanan jaringan seperti login jarak jauh (rlogin, telnet) dan transfer file (FTP). Karena ukuran data ini yang perlu ditransmisikan tidak pasti. UDP lebih sederhana dan lebih ringan dari TCP. UDP digunakan untuk mengimplementasikan beberapa layanan yang lebih real-time atau tidak penting untuk kehilangan paket. Tingkat kerugian paket UDP dalam LAN relatif rendah.
pemrograman soket di java
Di bagian berikut, saya akan menjelaskan cara menggunakan soket untuk menulis program klien dan server melalui beberapa contoh.
Catatan: Dalam contoh berikut, saya akan menggunakan pemrograman soket berdasarkan protokol TCP/IP, karena protokol ini jauh lebih banyak digunakan daripada UDP/IP. Dan semua kelas terkait soket terletak di bawah paket java.net, jadi kita perlu memperkenalkan paket ini saat kita melakukan pemrograman soket.
Menulis Klien
Nyalakan soket
Jika Anda berada di sisi klien, Anda perlu menulis kode berikut untuk membuka soket.
Host string = "127.0.0.1"; int port = 8919; socket klien = soket baru (host, port);
Dalam kode di atas, host adalah mesin yang perlu dihubungkan oleh klien, dan port adalah port yang digunakan oleh server untuk mendengarkan permintaan. Saat memilih port, satu hal yang perlu Anda perhatikan adalah bahwa port seperti 0 ~ 1023 telah dipesan oleh sistem. Port -port ini digunakan oleh beberapa layanan yang umum digunakan, seperti Mail, FTP dan HTTP. Saat Anda menulis kode sisi server dan memilih port, silakan pilih port yang lebih besar dari 1023.
Tulis data
Berikutnya adalah menulis data permintaan. Kami mendapatkan objek OutputStream dari objek soket klien dan kemudian menulis data. Sangat mirip dengan kode pemrosesan file IO.
Kelas Publik ClientSocket {public static void main (string args []) {string host = "127.0.0.1"; int port = 8919; coba {socket client = soket baru (host, port); Penulis penulis = outputStreamWriter baru (client.getoutputStream ()); writer.write ("halo dari klien"); writer.flush (); writer.close (); client.close (); } catch (ioException e) {e.printstacktrace (); }}}Tutup objek IO
Mirip dengan File IO, setelah membaca dan menulis data, kita perlu menutup objek IO untuk memastikan pelepasan sumber daya yang benar.
Penulisan sisi server
Buka soket sisi server
int port = 8919; server server = server baru (port); soket soket = server.accept ();
Kode di atas membuat soket sisi server, dan kemudian memanggil metode menerima untuk mendengarkan dan mendapatkan soket permintaan klien. Metode penerimaan adalah metode pemblokiran yang menunggu untuk memblokir sampai koneksi dibuat antara server dan klien.
Baca data
Dapatkan objek InputStream melalui objek soket yang diperoleh di atas, dan kemudian instal file IO untuk membaca data. Di sini kami mencetak konten.
Public Class ServerClient {public static void main (string [] args) {int port = 8919; coba {server server = server baru (port); Soket soket = server.accept (); Reader reader = new InputStreamReader (socket.getInputStream ()); char chars [] = char baru [1024]; int len; StringBuilder builder = new StringBuilder (); while ((len = reader.read (chars))! = -1) {builder.append (string baru (chars, 0, len)); } System.out.println ("Terima dari pesan klien =:" + builder); reader.close (); socket.close (); server.close (); } catch (Exception e) {E.PrintStackTrace (); }}}Tutup objek IO
Itu tidak bisa dilupakan. Akhirnya, saya perlu menutup objek IO dengan benar untuk memastikan pelepasan sumber daya yang benar.
Perhatikan contoh
Di sini kami menambahkan contoh, menggunakan soket untuk mengimplementasikan server gema, yaitu server akan melewati data yang dikirim oleh klien kembali ke klien. Kode ini sangat sederhana.
impor java.io.*; impor java.net.*; kelas publik echoserver {public static void main (string args []) {// bagian deklarasi: // mendeklarasikan soket server dan soket klien untuk server // deklarasi input dan output aliran server echoserver = null; Garis string; Datalputstream adalah; OS printstream; Socket ClientSocket = null; // Coba buka soket server di port 9999 // Perhatikan bahwa kami tidak dapat memilih port kurang dari 1023 jika kami bukan // pengguna istimewa (root) coba {echoServer = server baru (9999); } catch (ioException e) {System.out.println (e); } // Buat objek soket dari server untuk mendengarkan dan menerima // koneksi. // buka aliran input dan output coba {clientocket = echoServer.accept (); IS = DataInputStream baru (ClientKocket.getInputStream ()); os = printStream baru (clientocket.getoutputStream ()); // Selama kami menerima data, menggemakan data itu kembali ke klien. while (true) {line = is.readline (); os.println (baris); }} catch (ioException e) {System.out.println (e); }}}Kompilasi dan jalankan kode di atas dan buat permintaan berikut, Anda dapat melihat konten data yang dibawa oleh permintaan klien.
15:00 $ curl http://127.0.0.1:999/?111get/? 111 http/1.1User-agent: curl/7.37.1Host: 127.0.1.1:9999Accept: */ *
Meringkaskan
Cukup menarik untuk melakukan pemrograman klien-server, dan pemrograman soket di Java lebih mudah dan lebih cepat daripada bahasa lain (seperti C).
Paket Java.NET berisi banyak kelas yang kuat dan fleksibel untuk pengembang untuk memprogram jaringan. Saat membuat jaringan pemrograman, disarankan untuk menggunakan API di bawah paket ini. Pada saat yang sama, paket Sun.* juga berisi banyak kelas terkait pemrograman jaringan, tetapi tidak disarankan untuk menggunakan API di bawah paket ini, karena paket ini dapat berubah. Selain itu, paket ini tidak dapat dijamin dimasukkan dalam semua platform.
Di atas adalah kompilasi informasi soket java. Kami akan terus menambahkan pengetahuan yang relevan di masa depan. Terima kasih atas dukungan Anda untuk situs web ini!