Saya mendapatkan kesalahan berikut saat mencoba membaca dari soket. Saya melakukan readInt()
itu InputStream
, dan saya mendapatkan kesalahan ini. Membaca dokumentasi dengan teliti, ini menunjukkan bahwa bagian klien dari koneksi menutup koneksi. Dalam skenario ini, saya adalah server.
Saya memiliki akses ke file log klien dan tidak menutup koneksi, dan sebenarnya file log-nya menyarankan saya menutup koneksi. Jadi, apakah ada yang tahu mengapa ini terjadi? Apa lagi yang harus diperiksa? Apakah ini muncul ketika ada sumber daya lokal yang mungkin mencapai ambang batas?
Saya perhatikan bahwa saya memiliki baris berikut:
socket.setSoTimeout(10000);
tepat sebelum readInt()
. Ada alasan untuk ini (cerita panjang), tetapi hanya penasaran, adakah keadaan di mana hal ini dapat menyebabkan kesalahan yang ditunjukkan? Saya memiliki server yang berjalan di IDE saya, dan saya membiarkan IDE saya macet di breakpoint, dan saya kemudian melihat kesalahan yang sama persis mulai muncul di log saya sendiri di IDE saya.
Ngomong-ngomong, sebutkan saja, semoga bukan ikan haring merah. :-(
sumber
Jawaban:
Ada beberapa kemungkinan penyebabnya.
Ujung lainnya dengan sengaja mengatur ulang koneksi, dengan cara yang tidak akan saya dokumentasikan di sini. Jarang, dan umumnya tidak benar, perangkat lunak aplikasi melakukan ini, tetapi perangkat lunak komersial tidak dikenal.
Lebih umum, ini disebabkan oleh penulisan ke koneksi yang ujung lainnya sudah ditutup secara normal. Dengan kata lain kesalahan protokol aplikasi.
Ini juga dapat disebabkan oleh penutupan soket ketika ada data yang belum dibaca di soket penerima penerima.
Di Windows, 'perangkat lunak menyebabkan koneksi dibatalkan', yang tidak sama dengan 'reset koneksi', disebabkan oleh masalah jaringan yang dikirim dari pihak Anda. Ada artikel basis pengetahuan Microsoft tentang ini.
sumber
Reset koneksi berarti bahwa TCP RST telah diterima. Ini terjadi ketika rekan Anda menerima data yang tidak dapat diproses, dan ada berbagai alasan untuk itu.
Yang paling sederhana adalah ketika Anda menutup soket, dan kemudian menulis lebih banyak data pada aliran keluaran. Dengan menutup soket, Anda memberi tahu rekan Anda bahwa Anda selesai berbicara, dan itu dapat melupakan koneksi Anda. Saat Anda tetap mengirim lebih banyak data pada streaming itu, peer menolaknya dengan RST untuk memberi tahu Anda bahwa streaming tidak mendengarkan.
Dalam kasus lain, firewall yang mengganggu atau bahkan host jarak jauh itu sendiri mungkin "lupa" tentang koneksi TCP Anda. Ini dapat terjadi jika Anda tidak mengirim data apa pun untuk waktu yang lama (2 jam adalah waktu tunggu yang umum), atau karena rekan di-boot ulang dan kehilangan informasinya tentang koneksi aktif. Mengirim data pada salah satu koneksi yang tidak berfungsi ini akan menyebabkan RST juga.
Pembaruan sebagai tanggapan atas informasi tambahan:
Perhatikan baik-baik penanganan Anda terhadap
SocketTimeoutException
. Pengecualian ini dimunculkan jika batas waktu yang dikonfigurasi terlampaui saat diblokir pada operasi soket. Status soket itu sendiri tidak berubah saat pengecualian ini dilemparkan, tetapi jika penangan pengecualian Anda menutup soket, dan kemudian mencoba untuk menulis padanya, Anda akan berada dalam kondisi reset koneksi.setSoTimeout()
dimaksudkan untuk memberi Anda cara yang bersih untuk keluar dariread()
operasi yang mungkin akan memblokir selamanya, tanpa melakukan hal-hal kotor seperti menutup soket dari thread lain.sumber
Setiap kali saya mengalami masalah aneh seperti ini, saya biasanya duduk dengan alat seperti WireShark dan melihat data mentah yang diteruskan bolak-balik. Anda mungkin terkejut ketika ada hal-hal yang terputus, dan Anda hanya diberi tahu saat Anda mencoba dan membaca.
sumber
Memalukan untuk mengatakannya, tetapi ketika saya mengalami masalah ini, itu hanyalah kesalahan bahwa saya menutup koneksi sebelum saya membaca semua data. Dalam kasus dengan string kecil dikembalikan, itu berhasil, tetapi itu mungkin karena seluruh respons di-buffer, sebelum saya menutupnya.
Dalam kasus jumlah teks yang lebih panjang dikembalikan, pengecualian dilemparkan, karena lebih dari itu penyangga kembali.
Anda mungkin memeriksa pengawasan ini. Ingat membuka URL seperti file, pastikan untuk menutupnya (melepaskan koneksi) setelah selesai dibaca.
sumber
Anda harus memeriksa jejak lengkap dengan sangat hati-hati,
Saya memiliki aplikasi soket server dan memperbaiki
java.net.SocketException: Connection reset
kasus.Dalam kasus saya itu terjadi saat membaca dari
Socket
objek clientSocket yang ditutup koneksinya karena beberapa alasan. (Jaringan hilang, firewall atau aplikasi crash atau penutupan yang dimaksudkan)Sebenarnya saya sedang membangun kembali koneksi ketika saya mendapat kesalahan saat membaca dari objek Socket ini.
Hal yang menarik adalah
for my JAVA Socket
jika klien terhubung ke myServerSocket
dan menutup koneksinya tanpa mengirimis.read()
panggilan apa pun secara rekursif. Tampaknya karena berada dalam loop sementara yang tak terbatas untuk membaca dari soket ini, Anda mencoba membaca dari koneksi tertutup. Jika Anda menggunakan sesuatu seperti di bawah ini untuk operasi baca;Kemudian Anda mendapatkan stackTrace seperti di bawah ini dan seterusnya
Apa yang saya lakukan hanyalah menutup ServerSocket dan memperbarui koneksi saya dan menunggu koneksi klien masuk lebih lanjut
Ini memulihkan koneksi saya untuk soket klien yang tidak diketahui hilang
Saya tidak dapat menemukan cara lain karena seperti yang Anda lihat dari gambar di bawah ini Anda tidak dapat memahami apakah koneksi terputus atau tidak tanpa
try and catch
, karena semuanya tampak benar. Saya mendapatkan foto ini saat sayaConnection reset
terus melanjutkan.sumber
Saya mengalami kesalahan yang sama. Saya menemukan solusi untuk masalah sekarang. Masalahnya adalah program klien selesai sebelum server membaca aliran.
sumber
Saya mengalami masalah ini dengan sistem SOA yang ditulis di Java. Saya menjalankan klien dan server pada mesin fisik yang berbeda dan mereka bekerja dengan baik untuk waktu yang lama, kemudian pengaturan ulang koneksi yang buruk itu muncul di log klien dan tidak ada yang aneh di log server. Memulai ulang klien dan server tidak menyelesaikan masalah. Akhirnya kami menemukan bahwa heap di sisi server agak penuh sehingga kami meningkatkan memori yang tersedia untuk JVM: masalah terpecahkan! Perhatikan bahwa tidak ada OutOfMemoryError di log: memori hanya langka, tidak habis.
sumber
Periksa versi Java server Anda. Terjadi pada saya karena Weblogic 10.3.6 saya menggunakan JDK 1.7.0_75 yang ada di TLSv1. Titik akhir lainnya yang saya coba konsumsi adalah mematikan apa pun di bawah TLSv1.2.
Secara default Weblogic mencoba menegosiasikan protokol bersama terkuat. Lihat detailnya di sini: Masalah dengan pengaturan https.protocols System Property untuk koneksi HTTPS .
Saya menambahkan logging SSL verbose untuk mengidentifikasi TLS yang didukung. Ini menunjukkan TLSv1 sedang digunakan untuk jabat tangan.
-Djavax.net.debug=ssl:handshake:verbose:keymanager:trustmanager -Djava.security.debug=access:stack
Saya menyelesaikan ini dengan mendorong fitur ke produk kami yang kompatibel dengan JDK8, JDK8 default ke TLSv1.2. Bagi mereka yang dibatasi untuk JDK7, saya juga berhasil menguji solusi untuk Java 7 dengan meningkatkan ke TLSv1.2. Saya menggunakan jawaban ini: Cara mengaktifkan TLS 1.2 di Java 7
sumber
Saya juga mengalami masalah ini dengan program Java yang mencoba mengirim perintah di server melalui SSH. Masalahnya ada pada mesin yang menjalankan kode Java. Itu tidak memiliki izin untuk terhubung ke server jarak jauh. Metode write () baik-baik saja, tetapi metode read () melempar java.net.SocketException: Connection reset. Saya memperbaiki masalah ini dengan menambahkan kunci SSH klien ke kunci yang dikenal server jauh.
sumber
Dalam pengalaman saya, saya sering menghadapi situasi berikut;
Jika Anda bekerja di perusahaan korporat, hubungi jaringan dan tim keamanan. Karena dalam permintaan yang dibuat ke layanan eksternal, mungkin perlu memberikan izin untuk titik akhir yang relevan.
Masalah lainnya adalah bahwa sertifikat SSL mungkin telah kedaluwarsa di server tempat aplikasi Anda berjalan.
sumber