Artikel ini menjelaskan aplikasi klien sisi server sederhana dari pemrograman jaringan Java. Bagikan dengan semua orang untuk referensi Anda. Dengan rincian sebagai berikut:
Di Java, kami menggunakan java.net.Socket dan kelas terkaitnya untuk menyelesaikan fungsi terkait jaringan. Kelas Socket sangat sederhana dan mudah digunakan karena teknologi Java menyembunyikan proses kompleks dalam membuat koneksi jaringan dan mengirim data melalui koneksi tersebut. Apa yang disebutkan di bawah ini hanya berlaku untuk protokol TCP.
1. Hubungkan ke server
Kita dapat menggunakan konstruktor kelas Socket untuk membuka soket, seperti
Soket sk = Soket baru("210.0.235.14",13);
Diantaranya, 210.0.235.14 adalah objek String desimal bertitik, mewakili alamat IP (atau nama host) dari host tujuan, dan 13 mewakili port 13 yang ditunjuk untuk terhubung ke host tujuan. 210.0.235.14 di sini adalah server timing yang berlokasi di Hong Kong. Port default server timing umumnya adalah 13.
Perhatikan bahwa program memblokir hingga berhasil terhubung ke server.
Selanjutnya, Anda bisa menggunakan metode getInputStream() dari kelas Socket untuk mendapatkan objek InputStream. Melalui objek ini, Anda bisa mendapatkan informasi yang dikirimkan kepada kami oleh host target:
InputStream dalamStream = sk.getInputStream();
Demikian pula, untuk mengirim data ke host target, Anda dapat memanggil metode getOutputStream() untuk mendapatkan objek aliran keluaran.
Contoh fungsi berikut adalah untuk menyambung ke server pengaturan waktu dan mencetak informasi yang dikembalikan ke output standar:
coba { Socket sk = new Socket("210.0.235.14",13); sk.setSoTimeout(3000); InputStream inStream = sk.getInputStream(); //Dapatkan objek aliran masukan Scanner sc = new Scanner(inStream); / Cetak data ke konsol while(sc.hasNextLine()) { String str = sc.nextLine(); System.out.println("Output : " + str); } sk.close(); } catch(SocketTimeoutException e) //Pengecualian batas waktu { System.out.println("Waktu Habis!"); ) { e.printStackTrace();
Metode setSoTimeout() dalam kode dapat mengatur batas waktu, yaitu, jika operasi baca dan tulis belum selesai setelah waktu yang ditentukan, SocketTimeoutException akan dilempar, dan koneksi dapat ditutup dengan menangkap pengecualian ini.
Ada juga masalah timeout yang harus diselesaikan, yaitu konstruktor kelas Socket.
Soket baru (host, port);
Ini akan memblokir tanpa batas waktu hingga koneksi ke host target berhasil dibuat. Hal ini tentu bukan hal yang kita inginkan. Kami dapat mengatasi masalah ini dengan menelepon:
Socket sk = new Socker();sk.connect(new InetSocketAddress(host,port),2000);//Setel batas waktu menjadi 2 detik
2. Dapatkan alamat host
Metode statis getByName(nama host) dari kelas InetAddress dapat mengembalikan objek InetAddress yang mewakili alamat host. Objek ini menyertakan urutan 4-byte, yang merupakan alamat IP host. Kemudian panggil metode getHostAddress() untuk mengembalikan objek String yang mewakili alamat IP.
Beberapa nama host dengan volume lalu lintas tinggi biasanya berhubungan dengan beberapa alamat IP untuk mencapai penyeimbangan beban. Kita bisa mendapatkan semua alamat host dengan memanggil metode getAllByName(), yang mengembalikan array objek InetAddress.
Berikut ini adalah program kecil sederhana. Fungsinya adalah untuk mencetak alamat IP lokal jika tidak ada parameter yang ditetapkan pada baris perintah. Jika nama host ditentukan, semua alamat IP host akan dicetak:
paket cls; impor java.net.*; public class ShowIP { public static void main(String[] args) { coba { if(args.length > 0) { String hostName = args[0]; ] addr = InetAddress.getAllByName(hostName); //Dapatkan semua alamat host //Cetak output ke konsol for(InetAddress address : addr) { Sistem.keluar.println(alamat.getHostAddress()); } } else { Sistem.keluar.println(InetAddress.getLocalHost().getHostAddress()); }
3. Program sisi server
Aplikasi sisi server menggunakan kelas ServerSocket untuk membuat soket dan mengikatnya ke port lokal, seperti
kaus kaki ServerSocket = ServerSocker baru (8000);
Metode sock.accept() memungkinkan program menunggu koneksi terus menerus. Metode ini hanya akan mengembalikan objek Socket yang mewakili koneksi baru ketika klien terhubung, artinya metode ini akan memblokir.
Di sini umumnya perlu membuka thread baru untuk setiap koneksi untuk melayaninya.
Berikut ini adalah contoh lengkapnya. Server menunggu koneksi pada port 8400. Setiap kali koneksi tiba, thread baru dibuka untuk melayaninya dan informasi koneksi ditulis ke file log:
paket cls; impor java.io.*; impor java.net.*; impor java.util.*; kelas publik ServerDemo { /** * @param args */ public static void main(String[] args) { coba { //ServerSocket servSocket = ServerSocket baru(8000); ServerSocket servSocket = ServerSocket baru(8400); while(true) { Klien soket = servSocket.accept(); ++jumlah; Tanggal waktu = Tanggal baru(); String prompt = waktu.toString() + ":th" + jumlah + "pengguna" + klien.getInetAddress ( ).getHostAddress() + "Connected/n"; System.out.print(prompt); //Informasi keluaran di konsol ServerDemo.writeLog(prompt); //Tulis ke file//mulai Thread baru Thread th = new Thread(new ServThread(client,amount)); Tulis ke file log public static void writeLog(String str) { File logFile = new File("server-log.txt"); coba { FileWriter out = new FileWriter(logFile,true); out.append(str); out.close(); } catch(Pengecualian e) { e.printStackTrace(); /* * Kelas thread layanan*/ kelas ServThread mengimplementasikan Runnable { pribadi Klien soket; int pribadi ix; ServThread publik(Soket soc,int ix) { klien = soc; ini.ix = ix; { coba { InputStream inStream = client.getInputStream(); OutputStream outStream = client.getOutputStream(); Scanner recv = new Scanner(inStream send = new PrintWriter(outStream,true); Beberapa kata! [Masukkan 'bye' untuk menutup koneksi]"); while(recv.hasNextLine()) { String str = recv.nextLine(); if(str.equals("bye")) { send.println("Sampai jumpa nanti ~ ^-^"); break; } send.println("Ini adalah program uji, belum ada fungsinya"); } Tanggal waktu = Tanggal baru(); String prompt = time.toString() + ": pengguna" + ix + "th" + client.getInetAddress().getHostAddress() + "Terputus/n"; System.out.print(prompt); /Tulis ke file client.close(); } catch(Pengecualian e) { e.printStackTrace();
Program ini telah ditempatkan di server. Anda dapat menggunakan perintah telnet youthol.tk 8400 untuk melihat hasil menjalankan program ini.
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.