Bagaimana Menangani Java SocketException

1. Perkenalan

Dalam tutorial singkat ini, kita akan mempelajari penyebab SocketException dengan sebuah contoh.

Kami juga, tentu saja, akan membahas cara menangani pengecualian.

2. Penyebab SocketException

Penyebab paling umum dari SocketException adalah menulis atau membaca data ke atau dari koneksi soket tertutup. Penyebab lainnya adalah menutup koneksi sebelum membaca semua data di buffer soket.

Mari kita lihat lebih dekat beberapa alasan yang mendasari.

2.1. Jaringan Lambat

Koneksi jaringan yang buruk mungkin menjadi masalah yang mendasarinya. Menetapkan batas waktu koneksi soket yang lebih tinggi dapat menurunkan laju SocketException untuk koneksi lambat:

socket.setSoTimeout(30000); // timeout set to 30,000 ms

2.2. Intervensi Firewall

Firewall jaringan dapat menutup koneksi soket. Jika kami memiliki akses ke firewall, kami dapat mematikannya dan melihat apakah itu menyelesaikan masalah.

Jika tidak, kita dapat menggunakan alat pemantauan jaringan seperti Wireshark untuk memeriksa aktivitas firewall.

2.3. Koneksi Idle Panjang

Koneksi yang tidak aktif mungkin akan dilupakan oleh pihak lain (untuk menghemat sumber daya). Jika kita harus menggunakan koneksi dalam waktu lama, kita dapat mengirim pesan detak jantung untuk mencegah keadaan diam.

2.4. Aplikasi error

Terakhir, SocketException dapat terjadi karena kesalahan atau bug dalam kode kita.

Untuk mendemonstrasikan ini, mari mulai server di port 6699:

SocketServer server = new SocketServer(); server.start(6699);

Saat server dimulai, kami akan menunggu pesan dari klien:

serverSocket = new ServerSocket(port); clientSocket = serverSocket.accept(); out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String msg = in.readLine();

Setelah kami mendapatkannya, kami akan menanggapi dan menutup koneksi:

out.println("hi"); in.close(); out.close(); clientSocket.close(); serverSocket.close();

Jadi, misalkan klien terhubung ke server kami dan mengirim "hai":

SocketClient client = new SocketClient(); client.startConnection("127.0.0.1", 6699); client.sendMessage("hi");

Sejauh ini bagus.

Tapi, jika klien mengirim pesan lain:

client.sendMessage("hi again");

Karena klien mengirim "hi lagi" ke server setelah koneksi dibatalkan, SocketException terjadi.

3. Penanganan SocketException

Penanganan SocketException cukup mudah dan langsung. Mirip dengan pengecualian yang dicentang lainnya, kita harus membuangnya atau mengelilinginya dengan blok coba-tangkap.

Mari kita tangani pengecualian dalam contoh kita:

try { client.sendMessage("hi"); client.sendMessage("hi again"); } catch (SocketException e) { client.stopConnection(); }

Di sini, kami telah menutup koneksi klien setelahnyapengecualian terjadi. Mencoba lagi tidak akan berhasil, karena koneksi sudah ditutup. Sebagai gantinya, kita harus memulai koneksi baru:

client.startConnection("127.0.0.1", 6699); client.sendMessage("hi again");

4. Kesimpulan

Pada artikel ini, kami telah melihat apa yang menyebabkan SocketException dan cara menanganinya.

Seperti biasa, kode tersedia di Github.