Saya mendapatkan error berikut mencoba untuk membaca dari soket. I'm melakukan readInt()
pada InputStream
, dan saya mendapatkan kesalahan ini. Meneliti dokumentasi ini menunjukkan bahwa bagian klien dari koneksi menutup sambungan. Dalam skenario ini, saya server.
Saya memiliki akses ke client file-file log dan hal ini tidak menutup koneksi, dan bahkan file log menyarankan saya menutup koneksi. Jadi tidak ada yang tahu mengapa hal ini terjadi? Apa lagi untuk memeriksa? Hal ini muncul ketika ada sumber daya lokal yang mungkin mencapai ambang batas?
Saya perhatikan bahwa saya memiliki baris berikut:
socket.setSoTimeout(10000);
sesaat sebelum readInt()
. Ada alasan untuk ini (cerita panjang), tapi hanya ingin tahu, apakah ada keadaan di mana hal ini akan menyebabkan yang ditunjukkan kesalahan? Saya memiliki server yang berjalan di IDE saya, dan kebetulan saya meninggalkan saya IDE terjebak pada breakpoint, dan saya kemudian melihat yang sama persis kesalahan yang mulai muncul di saya sendiri log in saya IDE.
Toh, hanya menyebutkan hal itu, mudah-mudahan tidak herring merah. :-(
Ada beberapa kemungkinan penyebab.
Ujung yang lain telah sengaja me-reset koneksi, dengan cara yang saya tidak akan dokumen di sini. Hal ini jarang terjadi, dan umumnya tidak benar, untuk aplikasi perangkat lunak untuk melakukan hal ini, tetapi tidak diketahui untuk perangkat lunak komersial.
Lebih umum, hal itu disebabkan oleh penulisan untuk koneksi yang ujung lainnya sudah tertutup biasanya. Dengan kata lain aplikasi protokol kesalahan.
Hal ini juga dapat disebabkan oleh penutupan soket ketika ada data yang belum dibaca dalam soket menerima buffer.
Di Windows, 'perangkat lunak menyebabkan pembatalan koneksi', yang tidak sama dengan 'koneksi reset', disebabkan oleh masalah jaringan pengiriman dari akhir anda. Ada's artikel pangkalan pengetahuan Microsoft tentang hal ini.
Koneksi ulang hanya berarti bahwa TCP RST diterima. Hal ini terjadi ketika rekan anda menerima data yang dapat't proses, dan ada berbagai alasan untuk itu.
Yang paling sederhana adalah ketika anda menutup socket, dan kemudian menulis lebih banyak data pada output stream. Dengan menutup soket, anda mengatakan kepada rekan anda bahwa anda selesai berbicara, dan itu bisa melupakan koneksi anda. Ketika anda mengirim lebih banyak data pada aliran sungai itu pula, peer menolaknya dengan RST untuk membiarkan anda tahu itu isn't mendengarkan.
Dalam kasus lain, intervening firewall atau bahkan remote host itu sendiri mungkin "lupa" tentang koneksi TCP anda. Ini bisa terjadi jika anda don't mengirim data apa pun untuk waktu yang lama (2 jam adalah waktu yang umum-out), atau karena peer adalah reboot dan kehilangan informasi tentang koneksi yang aktif. Mengirim data pada salah satu dari ini mati koneksi akan menyebabkan RST juga.
Update dalam menanggapi informasi tambahan:
Mengambil melihat dari dekat penanganan anda dari SocketTimeoutException
. Pengecualian ini dinaikkan jika dikonfigurasi batas waktu terlampaui sementara diblokir pada soket operasi. Keadaan socket itu sendiri tidak berubah saat ini pengecualian dilemparkan, tetapi jika anda handler pengecualian menutup socket, dan kemudian mencoba untuk menulis untuk itu, anda'll berada di sambungan kondisi reset. setSoTimeout()
ini dimaksudkan untuk memberikan anda cara yang bersih untuk keluar dari read()
operasi yang mungkin memblokir selamanya, tanpa melakukan hal-hal kotor seperti menutup soket dari thread lain.
Setiap kali saya punya masalah aneh seperti ini, saya biasanya duduk dengan alat seperti WireShark dan melihat data mentah menjadi bolak-balik. Anda mungkin akan terkejut di mana hal-hal yang menjadi terputus, dan anda hanya menjadi pemberitahuan ketika anda mencoba dan baca.
Anda harus memeriksa full jejak sangat hati-hati,
I've server socket aplikasi dan tetap jawa.net.SocketException: Connection reset
kasus.
Dalam kasus saya itu terjadi saat membaca dari clientSocket Socket
objek yang menutup koneksi karena beberapa alasan. (Jaringan yang hilang,firewall atau aplikasi crash atau dimaksudkan dekat)
Sebenarnya saya adalah membangun kembali koneksi ketika saya mendapatkan pesan kesalahan saat membaca dari Soket ini objek.
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
Hal yang menarik adalah untuk saya JAVA Socket
jika seorang klien terhubung ke saya ServerSocket
dan menutup koneksi tanpa mengirim apa-apa ini.read()
panggilan itu sendiri secara rekursif.Tampaknya karena sedang dalam infinite loop sementara untuk membaca dari soket ini anda mencoba untuk membaca dari sambungan tertutup.
Jika anda menggunakan sesuatu seperti di bawah ini untuk operasi baca;
while(true)
{
Receive();
}
Kemudian anda mendapatkan stackTrace sesuatu seperti di bawah ini dan di
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
Apa yang saya lakukan adalah hanya penutupan ServerSocket dan memperbaharui hubungan saya dan menunggu untuk selanjutnya masuk sambungan klien
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
Ini reestablises koneksi saya untuk tidak diketahui client socket kerugian
private void tryReConnect()
{
try
{
ServerSocket.close();
//empty my old lost connection and let it get by garbage col. immediately
clientSocket=null;
System.gc();
//Wait a new client Socket connection and address this to my local variable
clientSocket= ServerSocket.accept(); // Waiting for another Connection
System.out.println("Connection established...");
}catch (Exception e) {
String message="ReConnect not successful "+e.getMessage();
logit();//etc...
}
}
Saya tidak't menemukan cara lain karena seperti yang anda lihat dari gambar di bawah ini anda dapat't memahami apakah koneksi hilang atau tidak tanpa menangkap
,karena segala sesuatu tampaknya benar . Aku punya ini foto sementara aku mendapatkan Koneksi reset
terus menerus.
Memalukan untuk mengatakan itu, tapi ketika aku punya masalah ini, itu hanya sebuah kesalahan yang aku menutup sambungan sebelum saya membaca semua data. Dalam kasus-kasus kecil dengan string yang dikembalikan, itu bekerja, tapi itu mungkin karena seluruh respon buffered, sebelum aku menutupnya.
Dalam kasus-kasus lama jumlah teks yang dikembalikan, pengecualian dilemparkan, karena lebih maka penyangga akan datang kembali.
Anda dapat memeriksa untuk pengawasan ini. Ingat membuka URL seperti file, pastikan untuk menutup itu (melepaskan sambungan) setelah itu telah sepenuhnya membaca.
Aku punya masalah ini dengan SOA sistem yang ditulis di Jawa. Aku berjalan baik klien dan server pada berbagai mesin secara fisik, dan mereka bekerja dengan baik untuk waktu yang lama, maka orang-orang jahat koneksi ulang muncul di client log dan tidak ada't apa-apa yang aneh dalam server log. Restart kedua klien dan server tidak't memecahkan masalah. Akhirnya kami menemukan bahwa tumpukan pada sisi server agak penuh sehingga kami meningkatkan memori yang tersedia untuk JVM: masalah teratasi! Perhatikan bahwa tidak ada OutOfMemoryError dalam log: memori hanya langka, tidak habis.
Saya juga punya masalah dengan program Java mencoba untuk mengirim perintah pada server melalui SSH. Masalah dengan mesin menjalankan kode Java. Itu didn't memiliki izin untuk terhubung ke remote server. Write() metode ini melakukan baik-baik saja, tapi baca() metode melemparkan jawa.net.SocketException: Koneksi ulang. Saya tetap masalah ini dengan menambahkan klien kunci SSH ke remote server yang dikenal tombol.
Periksa server's versi Java. Terjadi pada saya karena saya Weblogic 10.3.6 pada JDK 1.7.0_75 yang berada di TLSv1. Sisa akhir saya mencoba untuk mengkonsumsi adalah menutup apa pun di bawah TLSv1.2.
Secara default Weblogic mencoba untuk bernegosiasi terkuat bersama protokol. Lihat rincian berikut: https://stackoverflow.com/questions/34283829/issues-with-setting-https-protocols-system-property-for-https-connections.
Saya menambahkan verbose SSL login untuk mengidentifikasi didukung TLS. Ini ditunjukkan TLSv1 digunakan untuk jabat tangan.
-Djavax.net.debug=ssl:handshake:verbose:keymanager:trustmanager -Djava.keamanan.debug=akses:stack
Aku memutuskan hal ini dengan mendorong fitur untuk kami JDK8-produk yang kompatibel, JDK8 default untuk TLSv1.2. Bagi mereka dibatasi untuk JDK7, saya juga berhasil diuji solusi untuk Java 7 dengan meng-upgrade ke TLSv1.2. Saya menggunakan jawaban ini: https://stackoverflow.com/questions/39157422/how-to-enable-tls-1-2-in-java-7