Baca InputStream menggunakan Java Server Socket

1. Ikhtisar

Untuk mengirim dan menerima data melalui jaringan, kami sering menggunakan soket. Soket tidak lain adalah kombinasi dari alamat IP dan nomor port, yang secara unik dapat mengidentifikasi program yang berjalan pada mesin tertentu.

Dalam tutorial ini, kami akan menunjukkan bagaimana kami dapat membaca data yang dikirimkan kepada kami melalui soket.

2. Membaca Data Dari Socket

Mari kita asumsikan, kita memiliki pemahaman dasar tentang pemrograman soket.

Sekarang, kita akan menggali lebih dalam membaca data di port yang didengarkan oleh server kita.

Pertama, kita perlu mendeklarasikan dan menginisialisasi variabel ServerSocket, Socket, dan DataInputStream :

ServerSocket server = new ServerSocket(port); Socket socket = server.accept(); DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

Perhatikan bahwa kami telah memilih untuk membungkus InputStream soket dalam DataInputStream. Ini memungkinkan kita untuk membaca baris teks dan tipe data primitif Java dengan cara portabel.

Ini bagus karena sekarang, jika kita mengetahui tipe data yang akan kita terima, kita bisa menggunakan metode khusus seperti readChar (), readInt (), readDouble () , dan readLine ().

Namun, ini bisa menjadi tantangan jika jenis dan panjang data tidak diketahui sebelumnya.

Dalam hal ini, kita akan mendapatkan aliran byte dari soket, sebagai gantinya, menggunakan fungsi read () tingkat yang lebih rendah . Namun, ada sedikit masalah dalam pendekatan ini: Bagaimana kita mengetahui panjang dan jenis data yang akan kita dapatkan?

Mari jelajahi skenario ini di bagian selanjutnya.

3. Membaca Data Biner dari Socket

Saat membaca data dalam byte, kita perlu mendefinisikan protokol kita sendiri untuk komunikasi antara server dan klien. Protokol paling sederhana yang dapat kita definisikan disebut TLV (Type Length Value). Artinya, setiap pesan yang ditulis ke soket berupa Type Length Value.

Jadi kami mendefinisikan setiap pesan yang dikirim sebagai:

  • Karakter 1 byte yang mewakili tipe data, seperti s untuk String
  • Integer 4 byte yang menunjukkan panjang data
  • Dan kemudian data aktual, yang panjangnya baru saja ditunjukkan

Setelah klien dan server membuat koneksi, setiap pesan akan mengikuti format ini. Kemudian, kita dapat menulis kode kita untuk mengurai setiap pesan dan membaca n byte data dari tipe tertentu.

Mari kita lihat bagaimana kita bisa mengimplementasikan ini menggunakan contoh sederhana dengan pesan String .

Pertama, kita perlu memanggil fungsi readChar () , untuk membaca tipe data dan kemudian memanggil fungsi readInt () untuk membaca panjangnya:

char dataType = in.readChar(); int length = in.readInt();

Setelah itu, kita perlu membaca data yang kita terima. Hal penting yang perlu diperhatikan di sini adalah bahwa fungsi read () mungkin tidak dapat membaca semua data dalam satu panggilan. Jadi, kita perlu memanggil read () sebentar lagi:

if(dataType == 's') { byte[] messageByte = new byte[length]; boolean end = false; StringBuilder dataString = new StringBuilder(length); int totalBytesRead = 0; while(!end) { int currentBytesRead = in.read(messageByte); totalBytesRead = currentBytesRead + totalBytesRead; if(totalBytesRead =length) { end = true; } } }

4. Kode Klien untuk Mengirim Data

Dan bagaimana dengan kode sisi klien? Sebenarnya, ini cukup sederhana:

char type = 's'; // s for string String data = "This is a string of length 29"; byte[] dataInBytes = data.getBytes(StandardCharsets.UTF_8); out.writeChar(type); out.writeInt(dataInBytes.length); out.write(dataInBytes);

Hanya itu yang dilakukan klien kami!

5. Kesimpulan

Pada artikel ini, kami membahas cara membaca data dari soket. Kami melihat berbagai fungsi yang membantu kami membaca data dari tipe tertentu. Selain itu, kami melihat cara membaca data biner.

Implementasi lengkap dari tutorial ini dapat ditemukan di GitHub.