it-swarm-id.com

java.net.SocketException: Reset koneksi

Saya mendapatkan kesalahan berikut yang mencoba membaca dari soket. Saya sedang melakukan readInt() pada InputStream itu, dan saya mendapatkan kesalahan ini. Membaca dengan teliti dokumentasi 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 lognya menyarankan saya untuk menutup koneksi. Jadi, adakah 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);

sesaat sebelum readInt(). Ada alasan untuk ini (cerita panjang), tetapi hanya ingin tahu, apakah ada keadaan di mana ini dapat menyebabkan kesalahan yang ditunjukkan? Saya memiliki server yang berjalan di IDE saya, dan saya membiarkan IDE saya terjebak di breakpoint, dan saya kemudian melihat kesalahan yang sama persis mulai muncul di log saya sendiri di IDE saya.

Pokoknya, sebutkan saja, semoga bukan ikan herring merah. :-(

109
Darryl

Ada beberapa kemungkinan penyebabnya.

  1. Ujung yang lain sengaja mengatur ulang koneksi, dengan cara yang tidak akan saya dokumentasikan di sini. Jarang, dan umumnya salah, untuk perangkat lunak aplikasi melakukan ini, tetapi tidak diketahui untuk perangkat lunak komersial.

  2. Lebih umum, ini disebabkan oleh penulisan ke koneksi yang ujung lainnya sudah tertutup secara normal. Dengan kata lain kesalahan protokol aplikasi.

  3. Hal ini juga dapat disebabkan oleh penutupan soket ketika ada data yang belum dibaca di soket yang menerima buffer.

  4. Di Windows, 'perangkat lunak menyebabkan koneksi batal', yang tidak sama dengan 'koneksi reset', disebabkan oleh masalah jaringan yang dikirim dari ujung Anda. Ada artikel basis pengetahuan Microsoft tentang ini.

105
user207421

Reset koneksi hanya berarti bahwa TCP RST diterima. Ini terjadi ketika rekan Anda menerima data yang tidak dapat diproses, dan mungkin ada berbagai alasan untuk itu.

Yang paling sederhana adalah ketika Anda menutup soket, dan kemudian menulis lebih banyak data pada aliran output. Dengan menutup soket, Anda memberi tahu rekan Anda bahwa Anda sudah selesai berbicara, dan itu bisa melupakan koneksi Anda. Ketika Anda mengirim lebih banyak data pada aliran itu, rekan menolaknya dengan RST untuk memberi tahu Anda bahwa itu tidak mendengarkan.

Dalam kasus lain, firewall yang mengintervensi atau bahkan Host jarak jauh itu sendiri mungkin "lupa" tentang koneksi TCP Anda. Ini bisa terjadi jika Anda tidak mengirim data apa pun untuk waktu yang lama (2 jam adalah batas waktu yang umum), atau karena rekan itu di-boot ulang dan kehilangan informasinya tentang koneksi aktif. Mengirim data pada salah satu koneksi yang mati ini akan menyebabkan RST juga.


Pembaruan sebagai respons terhadap informasi tambahan:

Perhatikan baik-baik penanganan SocketTimeoutException Anda. Pengecualian ini dinaikkan jika batas waktu yang dikonfigurasi terlampaui saat diblokir pada operasi soket. Keadaan soket itu sendiri tidak berubah ketika pengecualian ini dilemparkan, tetapi jika pawang pengecualian Anda menutup soket, dan kemudian mencoba menulis ke sana, Anda akan berada dalam kondisi reset koneksi. setSoTimeout() dimaksudkan untuk memberi Anda cara bersih untuk keluar dari operasi read() yang mungkin akan memblok selamanya, tanpa melakukan hal-hal kotor seperti menutup soket dari utas lainnya.

43
erickson

Setiap kali saya memiliki 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 diberitahu ketika Anda mencoba dan membaca.

13
GEOCHET

Memalukan untuk mengatakannya, tetapi ketika saya memiliki masalah ini, itu hanyalah kesalahan bahwa saya menutup koneksi sebelum saya membaca semua data. Dalam kasus dengan string kecil yang dikembalikan, itu berhasil, tetapi itu mungkin karena seluruh respons buffer, sebelum saya menutupnya.

Dalam kasus jumlah teks yang lebih lama dikembalikan, pengecualian dilemparkan, karena lebih dari satu buffer kembali.

Anda mungkin memeriksa kesalahan ini. Ingat membuka URL seperti sebuah file, pastikan untuk menutupnya (lepaskan koneksi) setelah sepenuhnya dibaca.

8
Scott S

Anda harus memeriksa jejak penuh dengan sangat hati-hati,

Saya punya aplikasi soket server dan memperbaiki kasus Java.net.SocketException: Connection reset.

Dalam kasus saya itu terjadi saat membaca dari objek clientSocket Socket yang ditutup hubungannya karena beberapa alasan. (Jaringan hilang, firewall atau aplikasi crash atau hampir ditutup)

Sebenarnya saya sedang membangun kembali koneksi ketika saya mendapat kesalahan saat membaca dari objek Socket ini.

Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!

Yang menarik adalah for my Java Socket jika klien terhubung ke ServerSocket saya dan menutup koneksinya tanpa mengirim apa pun is.read() menyebut dirinya secara rekursif. Tampaknya karena berada dalam loop tak terbatas sementara untuk membaca dari soket ini Anda mencoba membaca dari yang tertutup koneksi. Jika Anda menggunakan sesuatu seperti di bawah ini untuk operasi baca;

while(true)
{
  Receive();
}

Kemudian Anda mendapatkan stackTrace sesuatu seperti di bawah ini terus dan terus

Java.net.SocketException: Socket is closed
    at Java.net.ServerSocket.accept(ServerSocket.Java:494)

Apa yang saya lakukan hanyalah menutup ServerSocket dan memperbarui koneksi saya dan menunggu koneksi klien yang masuk lebih lanjut

String Receive() throws Exception
{
try {                   
            int readed = is.read();
           ....
}catch(Exception e)
{
        tryReConnect();
        logit(); //etc
}


//...
}

Ini membangun kembali koneksi saya untuk kehilangan soket klien yang tidak dikenal

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 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 mendapat snapshot ini ketika saya mendapatkan Connection reset terus menerus.

enter image description here

8
Davut Gürbüz

Saya memiliki kesalahan yang sama. Saya menemukan solusi untuk masalah sekarang. Masalahnya adalah program klien selesai sebelum server membaca stream.

5
kml_ckr

Saya punya masalah dengan sistem SOA yang ditulis dalam Java. Saya menjalankan klien dan server pada mesin fisik yang berbeda dan mereka bekerja dengan baik untuk waktu yang lama, kemudian pengaturan koneksi yang buruk itu muncul di log klien dan tidak ada yang aneh di log server. Restart baik klien dan server tidak menyelesaikan masalah. Akhirnya kami menemukan bahwa tumpukan 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.

4
Pino

Saya juga mengalami masalah ini dengan program Java yang mencoba mengirim perintah pada server melalui SSH. Masalahnya adalah dengan 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: Reset koneksi. Saya memperbaiki masalah ini dengan menambahkan kunci SSH klien ke kunci server jauh yang dikenal.

1
pmartin8

Periksa versi Java server Anda. Terjadi pada saya karena Weblogic 10.3.6 saya ada di JDK 1.7.0_75 yang ada di TLSv1. Sisa titik akhir yang saya coba konsumsi adalah mematikan apa pun di bawah TLSv1.2.

Secara default, Weblogic mencoba untuk menegosiasikan protokol bersama yang terkuat. Lihat detailnya di sini: Masalah dengan pengaturan https.protocols Properti Sistem untuk koneksi HTTPS .

Saya menambahkan logging SSL verbose untuk mengidentifikasi TLS yang didukung. Ini menunjukkan TLSv1 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 terbatas pada JDK7, saya juga berhasil menguji solusi untuk Java 7 dengan memutakhirkan ke TLSv1.2. Saya menggunakan jawaban ini: Cara mengaktifkan TLS 1.2 di Java 7

0
behold