Salam
Hari ini saya ingin menganalisis proses penulisan aplikasi client-server yang melakukan fungsi utilitas Windows standar, seperti Telnet, TFTP, dan lain-lain, dan sebagainya di Jawa murni. Jelas bahwa saya tidak akan membawa sesuatu yang baru - semua utilitas ini telah berhasil bekerja selama lebih dari satu tahun, tetapi saya percaya bahwa tidak semua orang tahu apa yang terjadi di bawah tenda.
Inilah yang akan dibahas dalam cut.
Dalam artikel ini, agar tidak menunda, selain informasi umum, saya hanya akan menulis tentang server Telnet, tetapi saat ini masih ada materi tentang utilitas lain - itu akan menjadi bagian lebih lanjut dari siklus.
Pertama-tama, Anda harus memahami apa itu Telnet, mengapa itu diperlukan dan dengan apa ia dimakan. Saya tidak akan mengutip sumber kata demi kata (jika perlu - di akhir artikel saya akan melampirkan tautan ke materi terkait), saya hanya bisa mengatakan bahwa Telnet menyediakan akses jarak jauh ke baris perintah perangkat. Pada umumnya, ini adalah di mana fungsinya berakhir (saya diam-diam diam-diam menghubungi port server secara sadar, lebih lanjut tentang itu nanti). Jadi, untuk implementasinya, kita perlu menerima baris pada klien, mentransfernya ke server, mencoba mentransfernya ke baris perintah, membaca respons baris perintah, jika ada, mentransfernya kembali ke klien dan menampilkannya, atau, jika terjadi kesalahan, membuat pengguna mengerti bahwa ada sesuatu yang salah.
Untuk mengimplementasikan hal di atas, oleh karena itu, Anda memerlukan 2 kelas kerja, dan beberapa kelas uji dari mana kami akan memulai server dan melalui mana klien akan bekerja.
Dengan demikian, pada saat ini, struktur aplikasi meliputi:
- Telnetclient
- TelnetClientTester
- TelnetServer
- TelnetServerTester
Mari kita masing-masing:
TelnetclientSemua yang harus dapat dilakukan oleh kelas ini adalah mengirim perintah yang diterima dan menunjukkan jawaban yang diterima. Selain itu, Anda harus dapat terhubung dan memutuskan sambungan dari port yang sewenang-wenang (seperti yang disebutkan di atas) pada perangkat jarak jauh.
Untuk ini, fungsi-fungsi berikut diterapkan:
Fungsi yang mengambil alamat soket sebagai argumen, membuka koneksi dan memulai input dan output stream (variabel aliran dideklarasikan di atas, sumber lengkap di akhir artikel).
public void run(String ip, int port) { try { Socket socket = new Socket(ip, port); InputStream sin = socket.getInputStream(); OutputStream sout = socket.getOutputStream(); Scanner keyboard = new Scanner(System.in); reader = new Thread(()->read(keyboard, sout)); writer = new Thread(()->write(sin)); reader.start(); writer.start(); } catch (Exception e) { System.out.println(e.getMessage()); } }
Kelebihan fungsi yang sama, menghubungkan ke port default - untuk telnet ini adalah 23
public void run(String ip) { run(ip, 23); }
Fungsi membaca karakter dari keyboard dan mengirimkannya ke soket keluaran - yang tipikal, dalam string daripada mode karakter:
private void read(Scanner keyboard, OutputStream sout) { try { String input = new String(); while (true) { input = keyboard.nextLine(); for (char i : (input + " \n").toCharArray()) sout.write(i); } } catch (Exception e) { System.out.println(e.getMessage()); } }
Fungsi menerima data dari soket dan menampilkannya di layar.
private void write(InputStream sin) { try { int tmp; while (true){ tmp = sin.read(); System.out.print((char)tmp); } } catch (Exception e) { System.out.println(e.getMessage()); } }
Fungsi berhenti menerima dan mengirim data.
public void stop() { reader.stop(); writer.stop(); } }
TelnetServerKelas ini harus memiliki fungsi untuk menerima perintah dari soket, mengirimkannya untuk dieksekusi dan mengirim respons dari perintah kembali ke soket. Program tidak sengaja memeriksa data input, karena pertama, ada peluang untuk memformat disk server di "box telnet", dan kedua, masalah keamanan dalam artikel ini dihilangkan pada prinsipnya, dan itulah sebabnya tidak ada kata tentang enkripsi atau SSL
Hanya ada 2 fungsi (salah satunya kelebihan beban), dan secara umum ini bukan praktik yang baik, namun, sebagai bagian dari tugas ini, saya merasa pantas untuk meninggalkan semuanya apa adanya.
boolean isRunning = true; public void run(int port) { (new Thread(()->{ try { ServerSocket ss = new ServerSocket(port);
Program membuka port server, membaca data darinya, hingga bertemu dengan karakter terminasi perintah, mentransfer perintah ke proses baru, dan output dari proses diarahkan ke soket. Semuanya seperti senapan serbu Kalashnikov.
Karenanya, untuk fungsi ini ada kelebihan dengan port default:
public void run() { run(23); }
Nah dan karenanya, fungsi yang menghentikan server juga sepele, mengganggu siklus abadi, melanggar kondisinya.
public void stop() { System.out.println("Server was stopped"); this.isRunning = false; }
Saya tidak akan memberikan kelas tes di sini, mereka di bagian bawah - yang mereka lakukan hanyalah memeriksa kinerja metode publik. Semuanya ada di gita.
Ringkasnya, dalam beberapa malam Anda dapat memahami prinsip-prinsip pengoperasian utilitas konsol utama. Sekarang, ketika kita sampai ke komputer jarak jauh, kita mengerti apa yang terjadi - keajaiban telah menghilang)
Jadi tautannya adalah:
Semua sumber tadinya, ada dan akan ada di siniTentang TelnetLebih lanjut tentang Telnet