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.