Java Socket (soket) juga dikenal sebagai "soket", yang menggambarkan alamat dan port IP, dan merupakan pegangan untuk rantai komunikasi. Aplikasi biasanya membuat permintaan ke atau menjawab permintaan jaringan melalui "soket".
Gunakan soket untuk mewujudkan komunikasi antara banyak klien dan klien yang sama; Pertama, klien terhubung ke server untuk mengirim pesan, server memproses pesan setelah menerima pesan, dan kemudian membalas klien ke pesan setelah menyelesaikannya. Saya telah menulis kode yang diterapkan oleh server dan klien melalui pemikiran saya sendiri, berharap untuk belajar dari semua orang dan membuat kemajuan bersama.
Kode server
/** * Socket Server * Fungsi Deskripsi: * */Server kelas publik {/** * entri * * @param args * @throws ioException */public static void main (string [] args) melempar ioException {// untuk kesederhanaan, semua informasi pengecualian dikeluarkan port 889; ServerSocket (port); System.out.println ("Tunggu koneksi ke klien ..."); while (true) {// Server mencoba menerima permintaan koneksi dari soket lain. Metode penerimaan server adalah soket soket blocking = server.accept ();/*** Server kami menangani permintaan koneksi klien secara serempak. Setiap kali kami menerima permintaan koneksi dari klien, * kami harus berkomunikasi terlebih dahulu dengan klien saat ini sebelum memproses permintaan koneksi berikutnya. Ini akan secara serius mempengaruhi kinerja program ketika ada lebih banyak konkurensi. * Untuk tujuan ini, kita dapat mengubahnya menjadi pemrosesan asinkron berikut berkomunikasi dengan klien* /// setiap kali soket diterima, utas baru ditetapkan untuk menanganinya utas baru (tugas baru (soket)). Start ();} // server.close ();}/** Kelas socket yang menangani socket permintaan socket* // server. Tugas (soket soket) {this.socket = socket;} @override public void run () {coba {handlersocket ();} catch (pengecualian e) {e.printstacktrace ();}}/** * mengkomunikasikan dengan klien klien * @throws ioException */private hand canerler (throwsock {throwse {throws IoException */private hand landler private hand landler (private socket * * @throws IoException */private hand landler klien {private hand {throwsock * Dapatkan inputstream soket dan baca informasi yang dikirim oleh klien dari itu/*** Saat menerima data dari inputstream soket, membaca sedikit seperti di atas terlalu rumit. * Kadang -kadang kita akan mengubah menggunakan BufferedReader untuk membaca satu baris pada satu waktu * * Metode readline dari BufferedReader membaca satu baris pada satu waktu. Metode ini diblokir. Program tidak akan terus mengeksekusi sampai membaca baris data. * Jadi kapan Readline akan membaca baris? Metode readline tidak akan berpikir bahwa suatu baris telah dibaca, dan * akan mengakhiri pemblokiran dan membiarkan program terus dieksekusi. * Jadi ketika kita menggunakan BufferedReader's Readline untuk membaca data, kita harus ingat untuk menulis jeda baris dalam aliran output yang sesuai (* akan secara otomatis ditandai sebagai akhir setelah aliran berakhir, dan readline dapat dikenali). Setelah jeda garis menulis, kita harus ingat untuk menyiram jika aliran output tidak segera ditutup, * Hanya dengan begitu data dapat benar -benar ditulis dari buffer. */BufferedReader Br = BufferedReader baru (inputStreamReader baru (socket.getInputStream (), "utf -8")); stringBuilder sb = stringBuilder baru (); string temp; index; while ((temp = br.readline ())! = Null) {if (indeks = = BR.Readline ())! Penerimaan SB.Append (temp. "UTF-8");writer.write(String.format("Hi,%d. The sky is bright and the air is clear, the wind is smooth!", socket.getPort()));writer.flush();writer.close();System.out.println( "To Client[port:" + socket.getPort() + "] Reply to the client's message sent berhasil "); br.close (); socket.close ();}}}Kode klien
Impor java.io.inputStreamReader; import java.io.outputStreamWriter; impor java.io.reader; impor java.io.writer; impor java.net.socket;/*** @para klien* @Aut @Author {PARPER/@Author/Klien Public {public* @@Author/@Author/@Author/ @ @ @@Author/@Author/ @ @ @ @ @ @a. */public static void main (string [] args) {// buka tiga klien, satu utas mewakili klien untuk (int i = 0; i <3; i ++) {utas baru (runnable baru () {@Override public void run () {try {testclient client = testClientFactory.createClient (); klien. akhir pekan? ", client.client.getLocalport ())); client.receive ();} catch (exception e) {e.printstacktrace ();}}}). start ();}}/*** Factory yang menghasilkan klien uji klien uji {) {static creutlient {staticclion {Public creutlient {staticclient {staticclient {staticclion {staticclient {staticclient {Public crave croplient {) TestClient("127.0.0.1", 8899);}}/** * Test client*/static class TestClient {/** * Constructor* @param host IP address of the server to be connected* @param port The corresponding listening port of the server to be connected* @throws Exception */public TestClient(String host, int port) throws Exception {// Establish a connection with the server this.client = new Socket (host, port); System.out.println ("Client [port:" + client.getLocalport () + "] membuat koneksi dengan server ...");} klien soket pribadi; penulis penulis pribadi;/** * Kirim pesan * @param msg * @throws Excection */public void kirim (string msg) lemparan pengecualian {@param msg * @throws @throw * {writer = outputStreamWriter baru (client.getOutputStream (), "UTF-8");} writer.write (msg); writer.write ("eof/n"); writer.flush (); // setelah menulis, ingat ke sistem flush. Pengecualian */public void menerima () melempar pengecualian {// baca setelah menulis pembaca pembaca = inputStreamReader baru (client.getInputStream (), "UTF-8"); // Tetapkan waktu untuk menerima data ke 10 detik klien. = reader.read (chars))! = -1) {sb.append (string baru (chars, 0, len));} system.out.println ("klien [port:" + client.getLocalport () + "] Pesan diterima, konten:" + sb.tostring ()); reader.close (); writer.close (); client.close ();}}}Selanjutnya, mari kita simulasikan:
1. Jalankan server terlebih dahulu
2. Lalu jalankan klien (buka tiga permintaan klien)
Untuk demonstrasi, saya menggunakan alat Eclipse di server dan alat ide IntelliJ pada klien. Saat ini, Anda dapat melihat pesan yang dicetak oleh klien di konsol
Nomor port mewakili klien. Mari kita lihat kembali pesan yang dicetak oleh server di konsol.
Meringkaskan
Di atas adalah semua konten artikel ini tentang soket pemrograman Java yang menerapkan banyak klien untuk terhubung ke kode server yang sama. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan pesan dan editor akan membalas kepada semua orang tepat waktu.