Cara Mengendalikan Java SocketException

1. Pengenalan

Dalam tutorial ringkas ini, kita akan mengetahui sebab-sebab SocketException dengan contoh.

Kami juga tentu saja akan membincangkan cara menangani pengecualian.

2. Punca SocketException

Penyebab SocketException yang paling biasa adalah menulis atau membaca data ke atau dari sambungan soket tertutup. Punca lain ialah menutup sambungan sebelum membaca semua data dalam penyangga soket.

Mari kita perhatikan lebih dekat beberapa sebab yang mendasari.

2.1. Rangkaian perlahan

Sambungan rangkaian yang lemah mungkin merupakan masalah yang mendasari. Menetapkan batas waktu sambungan soket yang lebih tinggi dapat menurunkan kadar SocketException untuk sambungan lambat:

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

2.2. Campur Tangan Firewall

Firewall rangkaian dapat menutup sambungan soket. Sekiranya kita mempunyai akses ke firewall, kita dapat mematikannya dan melihat apakah ia menyelesaikan masalah.

Jika tidak, kita boleh menggunakan alat pemantauan rangkaian seperti Wireshark untuk memeriksa aktiviti firewall.

2.3. Sambungan Long Idle

Sambungan terbiar mungkin dilupakan pada hujungnya (untuk menjimatkan sumber). Sekiranya kita harus menggunakan sambungan untuk waktu yang lama, kita dapat menghantar mesej degupan jantung untuk mengelakkan keadaan terbiar.

2.4. Ralat Aplikasi

Akhir sekali, SocketException boleh berlaku kerana kesilapan atau pepijat dalam kod kami.

Untuk menunjukkan ini, mari kita mulakan pelayan di port 6699:

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

Apabila pelayan dimulakan, kami akan menunggu mesej dari pelanggan:

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 bertindak balas dan menutup sambungannya:

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

Oleh itu, katakan pelanggan menyambung ke pelayan kami dan menghantar "hi":

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

Setakat ini, begitu baik.

Tetapi, jika pelanggan menghantar mesej lain:

client.sendMessage("hi again");

Oleh kerana pelanggan menghantar "hi lagi" ke pelayan setelah sambungan dibatalkan, SocketException berlaku.

3. Pengendalian SocketException

Mengendalikan SocketException cukup mudah dan mudah. Sama seperti pengecualian lain yang diperiksa, kita mesti membuangnya atau mengelilinginya dengan blok cubaan.

Mari menangani pengecualian dalam contoh kami:

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

Di sini, kami telah menutup sambungan pelanggan selepas itupengecualian berlaku. Mencuba semula tidak akan berfungsi, kerana sambungan sudah ditutup. Sebaiknya kita memulakan sambungan baru:

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

4. Kesimpulan

Dalam artikel ini, kami telah melihat apa yang menyebabkan SocketException dan bagaimana mengatasinya.

Seperti biasa, kodnya terdapat di Github.