Saya menggunakan klien http apache commons commons untuk memanggil url menggunakan metode post untuk memposting parameter dan jarang sekali melemparkan kesalahan di bawah ini.
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
at java.io.FilterOutputStream.write(FilterOutputStream.java:80)
at org.apache.commons.httpclient.methods.ByteArrayRequestEntity.writeRequest(ByteArrayRequestEntity.java:90)
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
Adakah yang bisa menyarankan apa yang menyebabkan Pengecualian ini dan bagaimana cara debug itu?
Jawaban:
Ini disebabkan oleh:
Jadi dalam kedua kasus Anda memiliki protokol aplikasi yang didefinisikan atau diimplementasikan dengan buruk.
Ada alasan ketiga yang tidak akan saya dokumentasikan di sini tetapi yang melibatkan rekan kerja mengambil tindakan yang disengaja untuk mengatur ulang daripada menutup koneksi dengan benar.
sumber
XMLHttpRequest.abort()
).Dalam kasus kami, kami mengalami hal ini saat melakukan uji beban di server aplikasi kami. Masalahnya ternyata kita perlu menambahkan memori tambahan ke JVM kita karena sudah habis. Ini menyelesaikan masalah.
Coba tingkatkan memori yang tersedia untuk JVM dan atau pantau penggunaan memori saat Anda mendapatkan kesalahan itu.
sumber
SocketException: Pipa rusak, disebabkan oleh 'ujung lain' (klien atau server) menutup koneksi saat kode Anda sedang membaca dari atau menulis ke koneksi.
Ini adalah pengecualian yang sangat umum dalam aplikasi klien / server yang menerima lalu lintas dari klien atau server di luar kendali aplikasi. Sebagai contoh, klien adalah browser. Jika browser membuat panggilan Ajax, dan / atau pengguna hanya menutup halaman atau browser, maka ini dapat secara efektif membunuh semua komunikasi secara tak terduga. Pada dasarnya, Anda akan melihat kesalahan ini kapan saja ujung yang lain menghentikan aplikasi mereka, dan Anda tidak mengantisipasinya.
Jika Anda mengalami Pengecualian ini di aplikasi Anda, maka itu berarti Anda harus memeriksa kode Anda di mana IO (Input / Output) terjadi dan membungkusnya dengan blok coba / tangkap untuk menangkap IOException ini. Maka, terserah Anda untuk memutuskan bagaimana Anda ingin menangani situasi semi-valid ini.
Dalam kasus Anda, tempat paling awal di mana Anda masih memiliki kontrol adalah ajakan untuk
HttpMethodDirector.executeWithRetry
- Jadi pastikan panggilan tersebut dibungkus dengan blok coba / tangkap, dan tangani sesuai keinginan Anda.Saya akan sangat menyarankan agar logging Kesalahan khusus SocketException-Broken Pipe apa pun selain level debug / jejak. Selain itu, ini dapat digunakan sebagai bentuk serangan DOS (Denial Of Service) dengan mengisi log. Coba dan tegaskan dan uji negatif aplikasi Anda untuk skenario umum ini.
sumber
Semua aliran terbuka & koneksi harus ditutup dengan benar, jadi lain kali kita mencoba menggunakan objek urlConnection, itu tidak menimbulkan kesalahan. Sebagai contoh, perubahan kode berikut memperbaiki kesalahan saya.
Sebelum:
Setelah:
sumber
BufferedOutputStream
selalu memanggilclose()
aliran output yang mendasarinya (sehingga pada aliran outputurlConnection
). Lihat docs.oracle.com/javase/6/docs/api/java/io/… dan docs.oracle.com/javase/6/docs/api/java/io/… Jadi ketika Anda meneleponos.close()
, seharusnya sudah ditutup. . Tidak?Saya telah mengimplementasikan fungsionalitas pengunduhan data melalui server FTP dan menemukan pengecualian yang sama di sana saat melanjutkan pengunduhan itu. Untuk mengatasi pengecualian ini, Anda harus selalu memutuskan koneksi dari sesi sebelumnya dan membuat instance baru dari Klien dan koneksi baru dengan server. Pendekatan yang sama ini dapat bermanfaat bagi HTTPClient juga.
sumber
Saya memiliki masalah yang sama ketika saya sedang mengembangkan aplikasi Java sederhana yang mendengarkan TCP tertentu. Biasanya, saya tidak punya masalah, tetapi ketika saya menjalankan beberapa stress test saya perhatikan bahwa beberapa koneksi terputus karena kesalahan
socket write exception
.Setelah Investigasi saya menemukan solusi yang menyelesaikan masalah saya. Saya tahu pertanyaan ini cukup lama, tetapi saya lebih suka membagikan solusi saya, seseorang dapat menemukannya berguna.
Masalahnya adalah pada penciptaan ServerSocket. Saya membaca dari Javadoc ada batas default 50 pending socket. Jika Anda mencoba membuka koneksi lain, ini akan ditolak. Solusinya terdiri hanya dalam mengubah konfigurasi default ini di sisi server. Dalam kasus berikut, saya membuat server Socket yang mendengarkan pada port TCP
10_000
dan menerima200
soket maksimum yang tertunda.Dari Javadoc of ServerSocket :
sumber
Masalahnya mungkin bahwa file yang Anda gunakan tidak diperbarui dengan metode RMI yang benar. Periksa untuk melihat bahwa antarmuka RMI Anda memiliki parameter yang diperbarui, atau struktur data yang diperbarui yang tidak dimiliki klien Anda. Atau klien RMI Anda tidak memiliki parameter yang berbeda dari yang dimiliki versi server Anda.
Ini hanya tebakan yang terpelajar. Setelah menyebarkan kembali file kelas aplikasi server saya dan pengujian ulang, masalah "Pipa rusak" hilang.
sumber
Jawaban di atas menggambarkan alasan untuk ini
java.net.SocketException: Broken pipe
: ujung yang lain menutup koneksi. Saya ingin berbagi pengalaman tentang apa yang terjadi ketika saya mengalaminya:Content-Type
tajuk secara keliru disetel lebih besar dari badan permintaan sebenarnya (sebenarnya tidak ada badan sama sekali)Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.net.SocketTimeoutException: null
java.net.SocketException: Broken pipe
karena klien menutupnya.Kadang-kadang, kucing jantan tidak membuang pengecualian pip yang rusak, karena pengecualian batas waktu menutup koneksi, mengapa perbedaan seperti itu membingungkan saya juga.
sumber
Content-Type
Header tidak menentukan nomor, sehingga tidak bisa 'lebih besar' dari apa pun. Pengecualian batas waktu tidak menutup soket. Jawaban tidak masuk akal sama sekali.Anda harus meningkatkan "backlog" parameter ServerSocket Anda, misalnya
sumber
Penyebabnya adalah bahwa rekan jauh menutup soketnya (crash misalnya), jadi jika Anda mencoba menulis data kepadanya misalnya, Anda akan mendapatkan ini. untuk mengatasinya, lindungi operasi baca / tulis ke soket di antara (coba tangkap), lalu kelola kasus koneksi terputus ke tangkap (perpanjang koneksi, hentikan program, ... dll):
sumber