Aplikasi jaringan dibagi menjadi dua bagian: klien dan server, dan kelas soket adalah kelas Java yang bertanggung jawab untuk menangani komunikasi klien. Melalui kelas ini, Anda dapat terhubung ke server dengan IP atau nama domain tertentu, dan Anda dapat mengirim dan menerima data satu sama lain dengan server. Penggunaan Socket Class akan dibahas secara rinci dalam artikel ini dan beberapa artikel nanti, termasuk dasar -dasar Socket Class, berbagai metode koneksi, metode mendapatkan dan mengatur, waktu tunggu selama koneksi, dan penutupan koneksi jaringan, dll.
Dalam artikel ini, kita akan membahas langkah -langkah dasar dan metode menggunakan kelas soket. Secara umum, program klien jaringan harus melakukan tiga langkah berikut saat menghubungkan ke program layanan.
1. Sambungkan ke server
Klien dapat terhubung ke server dalam dua cara, satu adalah untuk terhubung ke server melalui IP, dan yang lainnya adalah untuk terhubung ke server melalui nama domain.
Bahkan, kedua metode ini pada dasarnya adalah satu arah. Di klien yang mendasarinya, mereka semua terhubung ke server melalui IP, tetapi ada perbedaan tertentu antara kedua metode tersebut. Jika program server terhubung melalui IP, klien hanya terhubung sesuai dengan IP. Jika server terhubung melalui nama domain, klien harus menyelesaikan nama domain ke dalam IP melalui DNS, dan kemudian terhubung sesuai dengan IP ini.
Dalam banyak bahasa pemrograman atau alat pengembangan (seperti C/C ++, Delphi) saat menghubungkan ke server menggunakan nama domain, Anda harus terlebih dahulu menyelesaikan nama domain ke IP, dan kemudian terhubung melalui IP. Di Java, fungsi resolusi nama domain telah dimasukkan dalam kelas soket. Oleh karena itu, kita hanya perlu menggunakan nama domain seperti menggunakan IP.
Metode yang paling umum untuk menghubungkan ke program server melalui kelas soket adalah dengan meneruskan IP atau nama domain dan nomor port sebagai parameter ke dalam kelas soket melalui konstruktor kelas soket. Ada banyak bentuk konstruktor kelas soket yang kelebihan beban. Di bagian ini, hanya satu dari bentuk yang paling umum digunakan yang dibahas: soket publik (host string, port int). Dari definisi konstruktor ini, Anda hanya perlu meneruskan IP atau nama domain dan nomor port langsung ke konstruktor. Kode berikut adalah contoh program yang terhubung ke program server:
paket mysocket; impor java.net.*; kelas publik myconnection {public static void main (string [] args) {coba {if (args.length> 0) {socket socket = socket baru (args [0], 80); System.out.println (args [0] + "berhasil terhubung!"); } else system.out.println ("Harap tentukan IP atau nama domain!"); } catch (Exception e) {System.err.println ("Pesan kesalahan:" + e.getMessage ()); }}} Pada hal di atas, nama IP atau domain diteruskan ke dalam program melalui parameter baris perintah, dan kemudian port 80 dari IP atau nama domain yang ditentukan melalui parameter baris perintah dihubungkan melalui soket soket = soket baru (args [0], 80). Karena konstruktor kelas soket menggunakan lemparan saat mendefinisikan, saat memanggil konstruktor kelas soket, Anda harus menggunakan pernyataan coba ... tangkap untuk menangkap kesalahan, atau menggunakan pernyataan lemparan untuk melempar kesalahan untuk fungsi utama.
Gunakan kelas soket untuk terhubung ke server untuk menentukan port mana yang dibuka pada host. Kode berikut adalah program yang memindai port mana yang dibuka di mesin ini.
2. Kirim dan terima data
Dua metode terpenting di kelas soket adalah GetInputStream dan GetOutputStream. Kedua metode ini digunakan untuk mendapatkan objek InputStream dan OutputStream untuk membaca dan menulis data, masing -masing. InputStream di sini membaca data yang dikirim oleh program server ke klien, dan outputStream adalah data yang ingin dikirim oleh klien ke program server.
Saat menulis program klien jaringan yang sebenarnya, apakah akan menggunakan GetInputStream atau GetOutputStream, dan siapa yang harus digunakan terlebih dahulu dan siapa yang akan digunakan nanti ditentukan oleh aplikasi spesifik. Misalnya, dengan menghubungkan ke port 80 (biasanya port default yang digunakan oleh protokol HTTP) dari situs web Post dan Telecommunications Press (www.ptpress.com.cn), mengirim string, dan akhirnya membaca informasi yang dikembalikan dari www.ptpress.com.cn.
paket mysocket; import java.net.*; import java.io.*; kelas publik myconnection2 {public static void main (string [] args) melempar pengecualian {socket socket = socket baru ("www.ptpress.com.cn", 80); // Kirim data ke program server outputStream ops = socket.getoutputStream (); OutputStreamWriter OPSW = OutputStreamWriter baru (OPS); BufferedWriter BW = New BufferedWriter (OPSW); bw.write ("halo dunia/r/n/r/n"); bw.flush (); // menerima data dari program server inputStream IPS = socket.getInputStream (); InputStreamReader ipsr = inputStreamReader baru (IPS); BufferedReader BR = BufferedReader baru (IPSR); String s = ""; while ((s = br.readline ())! = null) system.out.println (s); socket.close (); }} Saat menulis kode di atas, Anda harus memperhatikan dua poin berikut:
1. Untuk meningkatkan efisiensi transmisi data, kelas soket tidak mengirimkan data setiap kali metode penulisan dipanggil, tetapi menulis data yang akan ditransfer ke buffer (standarnya adalah 8192 byte), dan kemudian mengirimkan data dalam buffer ini bersama melalui metode flush. Oleh karena itu, bw.flush (); diperlukan.
2. Alasan mengapa "/r/n/r/n" ditambahkan setelah Hello World saat mengirim string adalah karena header protokol HTTP menggunakan "/r/n/r/n" sebagai bendera akhir (konten terperinci dari protokol HTTP akan dijelaskan nanti). Oleh karena itu, dengan menambahkan "/r/n/r/n" setelah mengirim string, program server dapat berpikir bahwa header HTTP telah berakhir dan dapat diproses. Jika "/r/n/r/n" tidak ditambahkan, program server akan menunggu akhir header HTTP, yaitu, "/r/n/r/n". Jika demikian, program server tidak akan mengirim informasi respons ke klien, dan BR.Readline () akan diblokir karena tidak dapat dibaca untuk menanggapi informasi sampai koneksi habis waktu.
3. Matikan koneksi jaringan
Sejauh ini, kami memiliki pemahaman awal tentang metode penggunaan dasar kelas soket, tetapi setelah kelas soket telah memproses data, metode akhir yang paling masuk akal adalah dengan menggunakan metode dekat kelas soket untuk menutup koneksi jaringan. Meskipun metode dekat telah digunakan di dalamnya, metode penutupan koneksi jaringan bukan hanya metode yang dekat. Mari kita lihat dalam keadaan apa Java dapat mematikan koneksi jaringan.
Ada empat situasi di mana koneksi jaringan dapat ditutup:
Meskipun semua 4 metode ini dapat mencapai tujuan yang sama, yang terbaik adalah menggunakan metode pertama atau kedua untuk menutup koneksi jaringan. Ini karena metode ketiga dan keempat umumnya tidak segera menutup koneksi jaringan. Jika demikian, untuk beberapa aplikasi, sejumlah besar koneksi jaringan yang tidak berguna akan ditinggalkan, yang akan menempati sejumlah besar sumber daya sistem.
Setelah objek soket ditutup, kita dapat menggunakan metode terisklosis untuk menentukan apakah objek soket dalam keadaan tertutup. Namun, apa yang dikembalikan dengan menggunakan metode isklosed adalah keadaan saat ini dari objek soket. Artinya, terlepas dari apakah objek soket telah berhasil terhubung, Isclosde mengembalikan benar selama itu dalam keadaan tertutup. Jika Anda hanya membuat objek soket yang tidak terhubung, ISCLOSE juga mengembalikan true. Seperti yang ditunjukkan dalam kode berikut, False akan menjadi output.
Soket soket = soket baru (); System.out.println (socket.isclosed ());
Selain metode ISCLOSE, kelas soket juga memiliki metode yang terhubung ke ISconected untuk menentukan apakah objek soket terhubung dengan sukses. Ketika Anda melihat nama ini, pembaca mungkin salah paham. Faktanya, metode yang terhubung dengan ISCICT menentukan bukan status koneksi saat ini dari objek soket, tetapi apakah objek soket telah berhasil terhubung. Jika telah berhasil terhubung, bahkan jika ISCLOSE mengembalikan true sekarang, ISConnected masih kembali benar. Oleh karena itu, untuk menentukan apakah objek soket saat ini berada dalam keadaan yang terhubung, metode isclose dan isconnected harus digunakan pada saat yang sama, yaitu, objek soket berada dalam keadaan yang terhubung hanya ketika ISCLOSE mengembalikan False dan ISConnected Returns True. Kode berikut menunjukkan proses pembuatan berbagai negara dari objek soket di atas.
paket mysocket; import java.net.*; kelas publik mycloseconnection {public static void printState (soket soket, nama string) {system.out.println (name + ".isclosed ():" + socket.isclosed ()); System.out.println (name + ".isconnected ():" + socket.isconnected ()); if (socket.isclosed () == false && socket.isconnected () == true) system.out.println (name + "Dalam status terhubung!"); else system.out.println (name + "Dalam keadaan yang tidak terhubung!"); System.out.println (); } public static void main (string [] args) melempar pengecualian {socket socket1 = null, socket2 = null; socket1 = soket baru ("www.ptpress.com.cn", 80); PrintState (Socket1, "Socket1"); socket1.getoutputStream (). tutup (); PrintState (Socket1, "Socket1"); socket2 = soket baru (); PrintState (Socket2, "Socket2"); socket2.close (); PrintState (Socket2, "Socket2"); }} Setelah menjalankan kode di atas, output berikut akan ditampilkan:
socket1.isclosed (): false
socket1.isconnected (): true
Socket1 dalam keadaan terhubung!
socket1.isclosed (): true
socket1.isconnected (): true
Socket1 berada dalam keadaan yang tidak terhubung!
socket2.isclosed (): false
socket2.isconnected (): false
Socket2 dalam keadaan yang tidak terhubung!
socket2.isclosed (): true
socket2.isconnected (): false
Socket2 dalam keadaan yang tidak terhubung!
Dari hasil output, dapat dilihat bahwa setelah outputstream Socket1 ditutup, Socket1 juga ditutup secara otomatis. Dalam kode di atas, kita dapat melihat bahwa untuk soket soket Socket2 yang tidak terhubung ke server, metode terisklosisnya salah. Jika Socket2 Metode Terisklosed Returns True, Metode Tutup harus disebut dapat ditampilkan menggunakan Socket2.close.
Meskipun sebagian besar waktu, kita dapat menggunakan kelas soket atau metode tutup dari aliran input dan output untuk menutup koneksi jaringan, kadang -kadang kita hanya ingin menutup outputstream atau inputstream, dan saat menutup aliran input dan output, kita tidak menutup koneksi jaringan. Ini membutuhkan penggunaan dua metode lain dari kelas soket: shutdownInput dan shutdownoutput. Kedua metode ini hanya menutup aliran input dan output yang sesuai, tetapi mereka tidak memiliki fungsi untuk menutup koneksi jaringan pada saat yang sama. Seperti metode terisklosed dan isconnected, kelas soket juga menyediakan dua metode untuk menentukan apakah aliran input dan output dari objek soket ditutup. Kedua metode ini adalah isInputShutdown () dan iSoutputShutdown (). Kode berikut menunjukkan proses penutupan hanya aliran input dan output:
paket mysocket; import java.net.*; kelas publik mycloseconnection1 {public static void printState (socket socket) {System.out.println ("isInputShutdown:" + socket.isInputshutdown ()); System.out.println ("isoutputshutdown:" + socket.isoutputshutdown ()); System.out.println ("isclosed:" + socket.isclosed ()); System.out.println (); } public static void main (string [] args) melempar pengecualian {socket socket = socket baru ("www.ptpress.com.cn", 80); printState (soket); socket.shutdownInput (); printState (soket); socket.shutdownoutput (); printState (soket); }} Setelah menjalankan generasi di atas, Anda akan mendapatkan output berikut:
isInputShutdown: false
ISOUTPUTSHUTDOWN: Salah
Terisklosed: Salah
IsInputShutdown: Benar
ISOUTPUTSHUTDOWN: Salah
Terisklosed: Salah
IsInputShutdown: Benar
ISOUTPUTSHUTDOWN: Benar
Terisklosed: Salah
Dari hasil output, kita dapat melihat bahwa metode terisklosis selalu mengembalikan false, jadi pasti bahwa shutdownInput dan shutdownoutput tidak mempengaruhi status objek soket.
Saya harap artikel ini akan membantu Anda. Ini semua untuk Java untuk menggunakan Socket Class untuk menerima dan mengirim konten data. Saya harap semua orang akan terus mengikuti situs web kami! Jika Anda ingin belajar Java, Anda dapat terus mengikuti situs web ini.