1. Dua masalah utama dalam pemrograman jaringan
Salah satunya adalah bagaimana menemukan satu atau lebih host secara akurat di jaringan, dan yang lainnya adalah bagaimana cara mengirimkan data secara andal dan efisien setelah menemukan host.
Dalam protokol TCP/IP, lapisan IP terutama bertanggung jawab atas lokasi host jaringan dan perutean transmisi data. Alamat IP dapat secara unik menentukan host di internet.
Lapisan TCP menyediakan mekanisme transmisi data yang andal (TCP) atau tidak dapat diandalkan (UDP) untuk aplikasi, yang merupakan objek utama pemrograman jaringan, dan umumnya tidak perlu peduli tentang bagaimana lapisan IP memproses data.
Model pemrograman jaringan yang paling populer saat ini adalah struktur klien/server (C/S). Artinya, salah satu pihak komunikasi bertindak sebagai server untuk menunggu pelanggan untuk mengirimkan permintaan dan merespons. Pelanggan berlaku untuk server saat layanan diperlukan. Server umumnya selalu berjalan sebagai daemon, mendengarkan port jaringan. Setelah pelanggan memintanya, itu akan memulai proses layanan untuk menanggapi pelanggan, dan pada saat yang sama terus mendengarkan port layanan itu sendiri sehingga pelanggan kemudian juga dapat memperoleh layanan tepat waktu.
2. Dua jenis protokol transmisi: TCP; UDP
TCP adalah singkatan dari Tranfer Control Protocol , protokol berorientasi koneksi yang memastikan transmisi yang andal. Transmisi melalui protokol TCP menghasilkan urutan aliran data bebas kesalahan. Koneksi harus dibuat antara dua pasang soket pengirim dan penerima untuk berkomunikasi berdasarkan protokol TCP. Ketika satu soket (biasanya soket server) sedang menunggu untuk membuat koneksi, soket lainnya dapat memerlukan koneksi. Setelah kedua soket ini terhubung, mereka dapat melakukan transmisi data dua arah, dan kedua belah pihak dapat melakukan operasi pengiriman atau penerima.
UDP adalah singkatan dari User Datagram Protocol . Ini adalah protokol tanpa koneksi. Setiap datagram adalah informasi independen, termasuk sumber lengkap atau alamat tujuan. Ini ditransmisikan ke tujuan di jaringan dengan jalur apa pun yang mungkin. Oleh karena itu, apakah dapat mencapai tujuan, waktu untuk mencapai tujuan, dan kebenaran konten tidak dapat dijamin.
Membandingkan:
UDP:
TCP:
aplikasi:
3. Pemrograman Jaringan Java Berbasis Soket
1. Apa itu soket
Dua program di jaringan mewujudkan pertukaran data melalui koneksi komunikasi dua arah. Salah satu ujung tautan dua arah ini disebut soket. Soket biasanya digunakan untuk terhubung antara pelanggan dan penyedia layanan. Socket adalah antarmuka pemrograman yang sangat populer dari protokol TCP/IP. Soket ditentukan secara unik oleh alamat IP dan nomor port.
Namun, jenis protokol yang didukung oleh soket tidak hanya TCP/IP, jadi tidak ada koneksi yang diperlukan antara keduanya. Di lingkungan Java, pemrograman soket terutama mengacu pada pemrograman jaringan berdasarkan protokol TCP/IP.
2. Proses komunikasi soket
Sisi server mendengarkan (mendengarkan) apakah ada permintaan koneksi pada port tertentu. Sisi klien mengeluarkan permintaan koneksi ke sisi server, dan sisi server mengirim pesan menerima kembali ke sisi klien. Koneksi dibuat. Sisi server dan klien dapat berkomunikasi satu sama lain melalui Metode Kirim, Tulis, dan lainnya.
Untuk soket yang berfungsi penuh, itu harus mencakup struktur dasar berikut, dan proses kerjanya mencakup empat langkah dasar berikut:
(1) Buat soket;
(2) buka input/outflow yang terhubung ke soket;
(3) membaca/menulis soket sesuai dengan protokol tertentu;
(4) Tutup soket. (Dalam aplikasi aktual, penutupan yang ditampilkan tidak digunakan. Meskipun banyak artikel merekomendasikan ini, dalam program saya, itu mungkin tidak berdampak karena program itu sendiri relatif sederhana dan memiliki persyaratan rendah.)
3. Buat soket
Soket (alamat inetaddress, int port); Soket (alamat inetaddress, int port, boolean stream); Soket (host string, int prot); Soket (host string, int prot, boolean stream); Soket (socketImpl IMP) soket (host string, port int, inetaddress localaddr, int localport) soket (alamat inetaddress, port int, server localaddr inetaddress, int localport) (port int); Serversocket (int port, int backlog); ServerSocket (int port, int backlog, inetaddress bindaddr) di mana alamat, host dan port adalah alamat IP, nama host dan nomor port dari pihak lain masing -masing dalam koneksi dua arah. Aliran menunjukkan apakah soketnya adalah soket aliran atau soket datagram. Localport menunjukkan nomor port host lokal, LocalAddr dan Bindaddr adalah alamat mesin lokal (alamat host dari server). IMP adalah kelas induk soket, yang dapat digunakan untuk membuat server dan membuat soket. Hitungan mewakili jumlah maksimum koneksi yang dapat didukung server. Misalnya: Belajar jaringan video http://www.xxspw.com socket client = socket baru ("127.0.01.", 80); Server server = server baru (80);Perhatikan bahwa Anda harus berhati -hati saat memilih port. Setiap port menyediakan layanan tertentu. Hanya dengan memberikan port yang benar dapat diperoleh layanan yang sesuai. Nomor port dari 0 ~ 1023 dicadangkan oleh sistem. Misalnya, nomor port dari layanan HTTP adalah 80, nomor port dari layanan telnet adalah 21, dan nomor port dari layanan FTP adalah 23. Oleh karena itu, ketika kami memilih nomor port, yang terbaik adalah memilih angka yang lebih besar dari 1023 untuk mencegah konflik.
Jika kesalahan terjadi saat membuat soket, iOException akan dihasilkan dan harus diproses dalam program. Jadi saat membuat soket atau server, pengecualian harus ditangkap atau dilemparkan.
4. Program klien/server sederhana
1. Program Klien
impor java.io.*; impor java.net.*; kelas publik talkClient {public static void main (string args []) {try {socket socket = socket baru ("127.0.0.1", 4700); // Kirim permintaan klien ke port 4700 dari mesin buferedReader sin = baru buferedReader (inputStreamReader baru (System.in)); // Bangun objek BufferedReader dari System Standard Input Device Printwriter OS = new printwriter (socket.getoutputStream ()); // Dapatkan aliran output dari objek soket dan buat objek printwriter bufferedReader adalah = BufferedReader baru (inputStreamReader baru (socket.getInputStream ())); // Dapatkan aliran input dari objek soket dan konstruk string readline objek bufferedReader yang sesuai; readline = sin.readline (); // Baca string dari input standar sistem while (! Readline.equals ("bye")) {// Jika string dibaca dari input standar adalah "bye", hentikan loop os.println (readline); // output string baca dari input standar sistem ke server os.flush (); // Segarkan aliran output sehingga server segera menerima string system.out.println ("klien:"+readline); // cetak baca string system.out.println ("server:"+is.readline ()); // Baca string dari server dan cetak ke output standar readline = sin.readline (); // Baca string dari input standar sistem} // Lanjutkan ke loop os.close (); // Tutup aliran output soket adalah.close (); // tutup socket input stream socket.close (); // tutup soket} catch (pengecualian e) {system.out.println ("error"+e); // Sebuah kesalahan terjadi, pesan kesalahan dicetak}}}2. Program sisi server
impor java.io.*; impor java.net.*; impor java.applet.applet; public class talkServer {public static void main (string args []) {try {serversocket server = null; coba {server = server baru (4700); // Buat ServerSocket untuk mendengarkan permintaan pelanggan di port 4700} catch (Exception e) {System.out.println ("Tidak dapat mendengarkan:"+e); // kesalahan, cetak pesan kesalahan} soket soket = null; coba {socket = server.accept (); // Gunakan penerimaan () untuk memblokir dan menunggu permintaan klien. Jika klien // Setelah permintaan datang, objek soket dihasilkan dan terus mengeksekusi} catch (Exception e) {System.out.println ("Kesalahan."+E); // Sebuah kesalahan terjadi, informasi kesalahan cetak dicetak} string line; BufferedReader adalah = BufferedReader baru (inputStreamReader baru (socket.getInputStream ())); // Dapatkan aliran input dari objek soket dan konstruk objek printwriter objek buffered yang sesuai OS = newPrintWriter (socket.getoutputStream ()); // Dapatkan aliran output dari objek soket dan buat objek printwriter bufferedReader sin = baru bufferedreader (inputStreamReader baru (System.in)); // Bangun System Objek BufferedReader.out.println ("Client:"+is.readline ()); // Cetak string yang dibaca dari klien pada baris output standar = sin.readline (); // Baca string dari input standar while (! Line.equals ("bye")) {// Jika string adalah "bye", hentikan loop os.println (baris); // output string os.flush () ke klien; // Segarkan aliran output sehingga klien segera menerima string system.out.println ("server:"+line); // cetak string baca system.out.println ("klien:"+is.readline ()); // Baca string dari klien dan cetak ke baris output standar = sin.readline (); // Baca string dari input standar sistem} // Lanjutkan ke loop os.close (); // Tutup aliran output soket adalah.close (); // tutup socket input stream socket.close (); // tutup server socket.close (); // tutup server} catch (pengecualian e) {system.out.println ("error:"+e); // Terjadi kesalahan, cetak pesan kesalahan}}}5. Mendukung program klien/server multi-klien
Program klien/server sebelumnya hanya dapat mengimplementasikan percakapan antara server dan satu pelanggan. Dalam aplikasi yang sebenarnya, program permanen sering dijalankan di server, yang dapat menerima permintaan dari beberapa klien lain dan menyediakan layanan yang sesuai. Untuk mewujudkan fungsi menyediakan layanan kepada banyak pelanggan di server, program di atas perlu diubah dan mekanisme multi-threading diimplementasikan. Server selalu mendengarkan apakah ada permintaan klien pada port yang ditentukan. Setelah permintaan klien didengar, server akan memulai utas layanan khusus untuk menanggapi permintaan klien. Server itu sendiri segera memasuki status mendengarkan setelah memulai utas, menunggu klien berikutnya tiba.