Diberikan cuplikan jejak tumpukan ini
Disebabkan oleh: java.net.SocketException: Perangkat lunak menyebabkan koneksi dibatalkan: kesalahan penulisan socket
di java.net.SocketOutputStream.socketWrite0 (Metode Asli)
Saya mencoba menjawab pertanyaan-pertanyaan berikut:
- Kode apa yang melempar pengecualian ini? (JVM? / Tomcat? / Kode saya?)
- Apa yang menyebabkan pengecualian ini dilemparkan?
Mengenai # 1:
Sumber JVM Sun tidak mengandung pesan persis ini, tapi saya pikir Perangkat Lunak teks menyebabkan koneksi dibatalkan: kesalahan penulisan socket berasal dari implementasi asli SocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
Mengenai # 2
Dugaan saya adalah bahwa hal itu disebabkan ketika klien telah memutuskan koneksi, sebelum mendapatkan respon penuh (misalnya mengirim permintaan, tetapi sebelum mendapatkan respon penuh, ia ditutup / dihentikan / offline)
Pertanyaan:
- Apakah asumsi di atas benar (# 1 dan # 2)?
- Bisakah ini dibedakan dari situasi: "tidak bisa menulis ke klien, karena kesalahan jaringan di sisi server "? atau akankah itu membuat pesan kesalahan yang sama?
- Dan yang paling penting: Apakah ada dokumen resmi (misalnya dari Sun) yang menyatakan hal di atas?
Saya perlu memiliki bukti bahwa tumpukan jejak ini adalah "kesalahan" klien soket, dan tidak ada yang bisa dilakukan server untuk menghindarinya. (kecuali menangkap pengecualian, atau menggunakan SocketOutputStream non Sun JVM, meskipun keduanya tidak benar-benar menghindari fakta bahwa klien telah mengakhiri)
outs.write(audioBytes);
)byte[]
keOutputStream
. Ketika audio plying dan saat diputar jika pengguna mengklik menu lain (yang mengirim permintaan server) saya mendapat kesalahan yang sama pada konsol. jadi apakah aman untuk mengabaikan pengecualian ini?Jawaban:
Lihat artikel MSDN ini . Lihat juga Beberapa informasi tentang 'Penghapusan koneksi yang disebabkan perangkat lunak' .
sumber
Itu
java.net.SocketException
dilemparkan ketika ada kesalahan membuat atau mengakses soket (seperti TCP ). Ini biasanya dapat disebabkan ketika server telah memutuskan koneksi (tanpa menutupnya dengan benar), jadi sebelum mendapatkan respon penuh Dalam kebanyakan kasus, ini dapat disebabkan oleh masalah batas waktu (mis. Respons membutuhkan waktu terlalu lama atau server dipenuhi dengan permintaan), atau klien mengirim SYN, tetapi tidak menerima ACK (pengakuan akan penghentian koneksi) . Untuk masalah batas waktu, Anda dapat mempertimbangkan untuk meningkatkan nilai batas waktu.Pengecualian Socket biasanya datang dengan pesan detail yang ditentukan tentang masalah ini.
Contoh pesan terperinci:
Kesalahan menunjukkan upaya untuk mengirim pesan dan koneksi telah dibatalkan oleh server Anda. Jika ini terjadi saat menghubungkan ke database, ini dapat dikaitkan dengan menggunakan driver Connector / J JDBC yang tidak kompatibel .
Solusi yang mungkin: Pastikan Anda memiliki perpustakaan / driver yang tepat di CLASSPATH Anda.
Ini bisa terjadi ketika ada masalah untuk terhubung ke remote. Misalnya karena pemeriksa virus menolak permintaan surat jarak jauh .
Solusi yang mungkin: Periksa layanan Pemindaian Virus apakah itu memblokir port untuk permintaan koneksi keluar.
Solusi yang mungkin: Pastikan Anda menulis panjang byte yang benar ke arus. Jadi periksa ulang apa yang Anda kirim. Lihat utas ini .
Aplikasi tidak memeriksa apakah koneksi tetap hidup telah kehabisan waktu di sisi server.
Solusi yang mungkin: Pastikan bahwa HttpClient adalah non-null sebelum membaca dari koneksi. E13222_01
Koneksi telah diakhiri oleh peer (server).
Koneksi telah diakhiri oleh klien atau ditutup oleh server pada akhir koneksi karena permintaan dengan permintaan.
Lihat: Apa yang menyebabkan java.net.SocketException saya: Koneksi reset?
sumber
HttpClient
makhluknull
tidak mungkin menyebabkanSocketException
. Tidak menulis panjang yang benar untuk streaming juga tidak.Saya telah melihat ini paling sering ketika firewall perusahaan pada workstation / laptop menghalangi, itu membunuh koneksi.
misalnya. Saya memiliki proses server dan proses klien pada mesin yang sama. Server mendengarkan pada semua antarmuka (0.0.0.0) dan klien mencoba koneksi ke antarmuka publik / rumah (perhatikan bukan antarmuka loopback 127.0.0.1).
Jika mesin memiliki jaringan yang terputus (mis. Wifi dimatikan) maka koneksi terbentuk. Jika mesin terhubung ke jaringan perusahaan (langsung atau vpn) maka koneksi terbentuk.
Namun, jika mesin terhubung ke wifi publik (atau jaringan rumah) maka firewall akan mematikan koneksi. Dalam situasi ini menghubungkan klien ke antarmuka loopback berfungsi dengan baik, hanya saja tidak ke antarmuka rumah / publik.
Semoga ini membantu.
sumber
Untuk membuktikan komponen mana yang gagal saya akan memonitor komunikasi TCP / IP menggunakan wireshark dan lihat siapa yang menutup port secara aktif, juga timeout bisa relevan.
sumber
Sudahkah Anda memeriksa kode sumber Tomcat dan sumber JVM? Itu mungkin memberi Anda lebih banyak bantuan.
Saya pikir pemikiran umum Anda baik. Saya harapkan
ConnectException
dalam skenario yang Anda tidak dapat terhubung. Di atas terlihat sangat seperti itu didorong oleh klien.sumber
Bagi siapa pun yang menggunakan program-program Server Klien sederhana dan mendapatkan kesalahan ini, ini merupakan masalah dari Input atau Output Stream yang tidak tertutup (lebih awal).
sumber
Saya menghadapi masalah yang sama.
Umumnya kesalahan semacam ini terjadi karena klien telah menutup koneksinya dan server masih mencoba untuk menulis pada klien itu.
Jadi pastikan klien Anda memiliki koneksi terbuka sampai server selesai dengan aliran outputnya.
Dan satu hal lagi, jangan lupa untuk menutup input dan output stream.
Semoga ini membantu.
Dan jika masih menghadapi masalah daripada menjelaskan masalah Anda di sini secara rinci.
sumber
Kesalahan ini terjadi pada saya saat menguji layanan sabun saya dengan klien SoapUI, pada dasarnya saya mencoba untuk mendapatkan pesan yang sangat besar (> 500kb) dan SoapUI menutup koneksi dengan batas waktu.
... dan beri nilai besar, seperti 180000 (3 menit), ini tidak akan menjadi perbaikan yang sempurna untuk masalah Anda karena file tersebut sebenarnya terlalu besar, tetapi setidaknya Anda akan mendapat respons.
sumber
Koneksi tertutup di klien lain
Dalam kasus saya, kesalahannya adalah:
Itu diterima dalam gerhana saat debugging aplikasi java mengakses database H2. Sumber kesalahannya adalah saya awalnya membuka database dengan SQuirreL untuk memeriksa integritas secara manual. Saya memang menggunakan flag untuk mengaktifkan beberapa koneksi ke DB yang sama (yaitu
AUTO_SERVER=TRUE
), jadi tidak ada masalah menghubungkan ke DB dari java.Kesalahan muncul ketika, setelah beberapa saat - itu adalah proses java yang panjang - Saya memutuskan untuk menutup SQuirreL ke sumber daya gratis. Tampaknya seolah-olah SQuirreL adalah orang yang "memiliki" server DB dan dimatikan dengan koneksi SQuirreL.
Restart aplikasi Java tidak menghasilkan kesalahan lagi.
konfigurasi
sumber
Dalam kasus saya, saya mengembangkan sisi klien dan server, dan saya memiliki pengecualian:
ketika kelas di klien dan server berbeda. Saya tidak mengunduh kelas server (Antarmuka) pada klien, saya hanya menambahkan file yang sama dalam proyek. Tapi jalannya harus persis sama. Sebagai contoh, pada proyek server saya memiliki paket layanan java \ rmi \ dengan beberapa serviceInterface dan implementasi, saya harus membuat paket yang sama pada proyek klien. Jika saya mengubahnya dengan java / rmi / server / layanan misalnya, saya mendapatkan pengecualian di atas. Pengecualian yang sama jika versi antarmuka berbeda antara klien dan server (bahkan dengan baris kosong ditambahkan secara tidak sengaja ... Saya pikir rmi membuat semacam kelas untuk memeriksa versi ... Saya tidak tahu ... Jika bisa Tolong ...
sumber
Server saya melempar pengecualian ini dalam 2 hari berlalu dan saya menyelesaikannya dengan memindahkan fungsi pemutusan dengan:
Sampai akhir utas cantuman. apakah itu akan membantu siapa pun.
sumber
Dalam situasi yang dijelaskan di bawah ini, pihak klien akan melemparkan pengecualian seperti itu:
Server diminta untuk mengautentikasi sertifikat klien, tetapi klien memberikan sertifikat yang Penggunaan Kunci yang Diperpanjang tidak mendukung auth klien, sehingga server tidak menerima sertifikat klien, dan kemudian menutup koneksi.
sumber
sisi klien ssl akan melemparkan pengecualian seperti itu dalam situasi di bawah ini (Saya telah menguji),:
server diminta untuk mengautentikasi sertifikat klien, tetapi klien memberikan sertifikat yang Penggunaan Kunci Diperpanjang tidak mendukung auth klien.
sumber
Saya menghadapi masalah yang sama dengan wireMock saat mengejek panggilan API lainnya. Sebelumnya saya mendefinisikan server seperti ini:
Tetapi harus didefinisikan seperti yang ditunjukkan di bawah ini:
sumber
NullPointerException
, bukan masalah ini.