“Yazılım nedeniyle bağlantı kesildi: soket yazma hatası”


157

Bu yığın izleme snippet'i verildiğinde

Nedeni: java.net.SocketException: Yazılım, bağlantı iptaline neden oldu: java.net.SocketOutputStream.socketWrite0
 adresinde yuva yazma hatası (Yerel Yöntem)

Aşağıdaki soruları cevaplamaya çalıştım:

  1. Bu istisnayı hangi kod atıyor? (JVM? / Tomcat? / Kodum?)
  2. Bu istisnanın atılmasına ne sebep olur?

# 1 ile ilgili:

Sun'ın JVM kaynağı tam olarak bu mesajı içermiyor, ancak Yazılımın bağlantıya neden olduğu metninin bağlantı iptaline neden olduğunu düşünüyorum : soket yazma hatası yerel uygulamadan SocketOutputStream:

private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
                 int len) throws IOException;

# 2 ile ilgili

Benim tahminim, istemci bağlantıyı sonlandırdığında, tam yanıtı almadan önce (örneğin bir istek gönderdi, ancak tam yanıtı almadan önce, kapatıldı / sonlandırıldı / çevrimdışı) neden olduğu.

Sorular:

  1. Yukarıdaki varsayımlar doğru mu (# 1 ve # 2)?
  2. Bu durumdan farklı olabilir mi: " sunucu tarafında bir ağ hatası nedeniyle istemciye yazılamadı "? yoksa aynı hata mesajını verir mi?
  3. Ve en önemlisi: Yukarıdakileri belirten resmi bir belge (örneğin Sun'dan) var mı?

Bu yığın izleme soket istemcisinin "hatası" olduğunu ve sunucunun önlemek için yapmış olabilir bir şey yok bir kanıt olması gerekir. (istisnayı yakalamak veya Sun olmayan bir JVM SocketOutputStream kullanmak dışında, her ikisi de istemcinin sonlandırıldığından gerçekten kaçınmaz)


Firefox ile indirmeyi iptal ederken bu sorunu
yaşıyorum

(Yazma / gönderilirken Hey Eran Ben de bu istisna alıyorum outs.write(audioBytes);) byte[]için OutputStream. Ses dolaşırken ve kullanıcı başka bir menüye tıklarsa (sunucu isteği gönderirse) konsolda aynı hatayı aldım. bu istisnayı görmezden gelmek güvenli midir?
Amogh

1
@Amogh - Öyle görünüyor, evet. Temel olarak cevapların tanımladığı şeyden, bu Windows'a özgü bir hatadır, ancak Linux'ta sadece farklı bir ifadeyle aynı istisnayı alacağınızı varsayıyorum ... (Laymen terimlerim bunun temelde, bunun, X ve X'in uzak bir yere bir soket aracılığıyla ortada bağlantısı kesildi, ancak eminim bunu tanımlamanın en doğru yolu değil)
Eran Medan

1
Benim için bu, veritabanı sunucusu yeniden başlatıldığında ve uygulama daha önce açılan bağlantıları kullanarak sorgulamaya çalıştığında oldu. DBCP tabanlı havuzu kullandığımız için bunların neden yenilenmediğinden emin değilim. Ancak uygulamayı yeniden başlatmak sorunu çözdü.
Kshitiz Sharma

Yanıtlar:


55

Bu hata, yerel ağ sistemi, veri yeniden iletimi başarısız olduktan sonra WinSock'un kurulan bir bağlantıyı kapatması gibi bir bağlantıyı iptal ettiğinde ortaya çıkabilir (alıcı veri akışı soketine gönderilen verileri asla kabul etmez).

Bkz bu MSDN makalesine . Ayrıca bkz. 'Yazılım nedeniyle bağlantı kesildi' hakkında bazı bilgiler .



3
@MatGessel Bu makale sadece karışıklığı tekrarlıyor ve kendisinin bir kısmını ekliyor. WSAECONNABORTED bir Winsock hata kodudur, bu yüzden bunun Berkeley açıklaması olamaz. HTTP sunucusu hakkında açıklanan durum WSAECONNABORTED değil ECONNRESET üretir.
Lorne Marquis

@EJP, ben de bu istisna OutputStream için gönderme / yazma (outs.write (audioBytes);) byte [] alırken alıyorum. Ses dolaşırken ve kullanıcı başka bir menüye tıklarsa (sunucu isteği gönderirse) konsolda aynı hatayı aldım. bu istisnayı görmezden gelmek güvenli midir?
Amogh

1
@rustyx Burada belirtilen üç kaynağın tümü ACK arızaları tarafından üretildiğini belirtmektedir. Kendi talebiniz için bir kaynağınız varsa lütfen alıntı yapın.
Lorne Marquis

2
Sorunu daha ileriye götürmek için size bilgi vermediğinden, bu gerçek bir cevap değildir. Bu sorunun cevabı temelde "ağda kötü bir şey oldu". Hangi günlüklerin ve diğer etkinlik kayıtlarının altta yatan sorunu saptamamı sağlayabileceğini anlamak gerçekten yararlı olacaktır.
Derek Bennett

11

java.net.SocketExceptionOluşturma veya erişirken bir hata olduğunda atılır bir yuva gibi ( TCP ). Bu genellikle sunucu bağlantıyı sonlandırdığında (düzgün kapatmadan), bu nedenle tam yanıt almadan önce neden olabilir. Çoğu durumda buna zaman aşımı sorunu neden olabilir (örneğin yanıt çok fazla zaman alır veya sunucu isteklerle aşırı yüklenir) veya istemci SYN'yi gönderir, ancak ACK (bağlantı sonlandırmasının onayı) almaz . Zaman aşımı sorunları için zaman aşımı değerini artırmayı düşünebilirsiniz.

Soket İstisnası genellikle sorun hakkında belirtilen ayrıntı mesajıyla birlikte gelir.

Ayrıntılı mesajlara örnek:

  • Yazılım, bağlantı hatasına sebep oldu: recv başarısız.

    Hata, mesajı gönderme girişiminde bulunduğunu ve bağlantının sunucunuz tarafından iptal edildiğini gösterir. Veritabanına bağlanırken bu olursa, bu uyumlu olmayan Connector / J JDBC sürücüsünün kullanılmasıyla ilgili olabilir .

    Olası çözüm: CLASSPATH ürününüzde uygun kitaplıkların / sürücülerin bulunduğundan emin olun.

  • Yazılım bağlantıya neden oldu: bağlan.

    Bu, uzaktan kumandaya bağlanırken bir sorun olduğunda olabilir. Örneğin , virüs denetleyicisinin uzak posta isteklerini reddetmesi nedeniyle .

    Olası çözüm: Virüs tarama hizmetine giden bağlantı istekleri için bağlantı noktasını engelleyip engellemediğini kontrol edin.

  • Yazılım bağlantı kesilmesine neden oldu: soket yazma hatası.

    Olası çözüm: Akıma doğru bayt uzunluğunu yazdığınızdan emin olun. Ne gönderdiğinizi bir kez daha kontrol edin. Bu konuya bakın .

  • Eş tarafından bağlantı sıfırlama: soket yazma hatası / Eş tarafından bağlantı kesildi: soket yazma hatası

    Uygulama canlı tutma bağlantısının sunucu tarafında zaman aşımına uğradı mı kontrol etmedi.

    Olası çözüm: Bağlantıdan okumadan önce HttpClient'in boş olmadığından emin olun. E13222_01

  • Eş tarafından bağlantı sıfırlandı.

    Bağlantı eş tarafından (sunucu) sonlandırıldı.

  • Bağlantı sıfırlandı.

    Bağlantı, istekte bulunulması nedeniyle istemci tarafından sonlandırıldı veya bağlantının sunucu sonu tarafından kapatıldı.

    Bkz: Java.net.NocketException neden: Bağlantı sıfırlama?


Bu 6 noktadan sadece biri soruyu yanlış cevaplıyor. Bazıları da yanlış. Uygulama , 'canlı tutma bağlantısının sunucu tarafında zaman aşımına uğramış olup olmadığını kontrol edemez .' HttpClientVarlık nullmuhtemelen bir sebep olamaz SocketException. Akıma doğru uzunluğu yazmamak da olmaz.
Lorne Marquis

9

Bunu en sık iş istasyonu / dizüstü bilgisayar üzerindeki kurumsal güvenlik duvarı engellediğinde gördüm, bağlantıyı öldürdü.

Örneğin. Aynı makinede bir sunucu işlemi ve bir istemci işlemi var. Sunucu tüm arabirimleri dinliyor (0.0.0.0) ve istemci genel / ev arabirimi ile bağlantı kurmaya çalışıyor (127.0.0.1 geridönüş arabirimini not etmeyin).

Makinenin ağ bağlantısı kesilmişse (örn. Wifi kapalı), bağlantı kurulur. Makine şirket ağına (doğrudan veya vpn) bağlıysa, bağlantı oluşturulur.

Ancak, makine genel bir wifi'ye (veya ev ağına) bağlıysa, güvenlik duvarı bağlantıyı keser. Bu durumda istemciyi geridöngü arabirimine bağlamak, ev / genel arabirime değil, iyi çalışır.

Bu yardımcı olur umarım.


3
Güvenlik duvarları bağlantıları önler . Soru mevcut bir bağlantının sıfırlanmasıyla ilgilidir.
Lorne Marquis

4

Hangi bileşenin başarısız olduğunu kanıtlamak için wireshark kullanarak TCP / IP iletişimini izleyeceğimi ve bağlantı noktasını aktif olarak kapatacağına baktığımda zaman aşımları da önemli olabilir.


Kimse limanı kapatmıyor. İşletim sistemi bağlantıyı iptal ediyor.
Lorne Marquis

@EJP Bu aşırı yükler ve bellek bittiğinde olduğunu gördüm. Bağlantıyı kapatan işletim sistemi olduğundan emin değilim ama JVM çıldırıyor.
Zee

1
@Zee Wireshark'ta FIN olarak görünen bir bağlantı noktasını kapatmak ile bağlantıyı iptal etmek arasında fark yoktur.
Lorne Marquis

2

Tomcat kaynak kodunu ve JVM kaynağını kontrol ettiniz mi? Bu size daha fazla yardım sağlayabilir.

Bence genel düşünceniz iyi. Bir beklenir ConnectExceptionBağlanmak olamayacağını senaryoda. Yukarıdaki gibi müşteri odaklı gibi görünüyor.


3
Evet, kontrol ettim. Tomcat'in kaynaklarında cümlenin herhangi bir permütasyonu yoktu, teşekkürler.
Eran Medan

1
Hayır o Tomcat kaynağı aramadı VE JVM kaynağını.
Stephen C

Veya JVM kaynağını kontrol ettiyse, hepsini kontrol etmedi.
Stephen C

1
@Ehrann - ileti dizesi büyük olasılıkla yerel kaynaklarda bulunur. Ancak olay günlüğünü de kontrol etmelisiniz. IMO, ikincisinin daha bilgilendirici olması muhtemeldir.
Stephen C

6
Bu ileti dizesi aslında işletim sisteminden gelir.
Lorne Marquis

2

Basit İstemci Sunucusu programlarını kullanan ve bu hatayı alan herkes için bu, kapatılmamış (veya erkenden kapatılmış) Giriş veya Çıkış Akışları sorunudur.


2
Hayır değil. Bu, sonunda bir FD tükenmesine neden olacak bir soket sızıntısını oluşturacaktır.
Lorne Marquis

0

Aynı sorunla karşı karşıyaydım.
Genellikle bu tür bir hata, istemci bağlantısını kapattığından ve sunucunun hala bu istemcide yazmaya çalışmasından kaynaklanır.
Bu nedenle, sunucunun çıkış akışı ile yapılana kadar istemcinizin bağlantısının açık olduğundan emin olun.
Ve bir şey daha, giriş ve çıkış akışını kapatmayı unutma .

Bu yardımcı olur umarım.
Ve hala sorunla karşılaşıyorsanız, sorununuzu burada ayrıntılı olarak açıklayın.


3
@BhavinChhatrola Hayır, yanlış bir cevap. Açıklanan durum, sorudaki hatayı değil, 'eş tarafından bağlantı sıfırlama' üretir.
Lorne Marquis

0

SoapUI istemcisi ile sabun servisimi test ederken bu hata bana oldu, temelde çok büyük bir mesaj almaya çalışıyordum (> 500kb) ve SoapUI bağlantı zaman aşımı ile kapattı.

SoapUI'de şu adrese gidin:

Dosya -> Tercihler - Soket Zaman Aşımı (ms)

... ve 180000 (3 dakika) gibi büyük bir değer koyun, dosya aslında büyük olduğu için sorununuz için mükemmel bir çözüm olmayacak, ancak en azından bir yanıt alacaksınız.


0

Başka bir istemcide kapalı bağlantı

Benim durumumda, hata:

java.net.SocketException: Software caused connection abort: recv failed

H2 veritabanına erişen bir java uygulamasında hata ayıklanırken tutulma içinde alındı. Hatanın kaynağı, başlangıçta SQuirreL ile veritabanını bütünlük açısından manuel olarak kontrol etmek için açmış olmamdı. Ben AUTO_SERVER=TRUEjava DB bağlanma hiçbir sorun yoktu bu yüzden aynı DB (ie ) birden çok bağlantıyı etkinleştirmek için bayrak kullandınız .

Hata, bir süre sonra - uzun bir java işlemi olduğunda - SQuirreL'yi ücretsiz kaynaklara kapatmaya karar verdiğimde ortaya çıktı. SQuirreL, DB sunucu örneğine "sahip" olan ve SQuirreL bağlantısıyla kapatılmış gibi görünüyor.

Java uygulamasının yeniden başlatılması hatayı bir daha vermedi.

yapılandırma

  • Windows 7
  • Eclipse Kepler
  • SQuirreL 3.6
  • org.h2.Driver sürüm 1.4.192

0

Benim durumumda, istemci ve sunucu tarafı geliştirdim ve istisna var:

Neden: hata düzenleme argümanları; içiçe kural dışı durum: java.net.SocketException: Yazılım bağlantı kesintisine neden oldu: yuva yazma hatası

istemci ve sunucudaki sınıflar farklı olduğunda. İstemcide sunucunun sınıflarını (Arayüzler) indirmiyorum, projeye aynı dosyaları eklemem yeterli. Ancak yol tamamen aynı olmalıdır. Örneğin, sunucu projesinde bazı serviceInterface ve uygulamalar ile java \ rmi \ services paketleri var, istemci projesinde aynı paketi oluşturmak zorundayım. Örneğin java / rmi / server / services ile değiştirirsem yukarıdaki istisnayı alıyorum. Arayüz sürümü istemci ve sunucu arasında farklıysa (istisna olarak boş bir satır bile olsa) aynı istisna ... Ben rmi sürümü kontrol etmek için sınıfların bir tür karma yapar ... Bilmiyorum ... Eğer olabilir Yardım ...


-1

Sunucum 2 gün içinde bu istisnayı atıyordu ve ben bağlantı kesme fonksiyonu ile taşıyarak çözdü:

outputStream.close();
inputStream.close();
Client.close();

Giriş dizisinin sonuna. eğer herkese yardım ederse.


-1

Aşağıda açıklanan durumda, müşteri tarafı böyle bir istisna atacaktır:

Sunucudan istemci sertifikasının kimliğini doğrulaması istenir, ancak istemciden Genişletilmiş Anahtar Kullanımı'nın istemci kimlik doğrulamasını desteklemediği bir sertifika sağlar, bu nedenle sunucu istemcinin sertifikasını kabul etmez ve bağlantıyı kapatır.


Bu cevap yanlış. Açıklamanız durumunda bir SSLException atılır.
Başkan James K. Polk

aslında SocketException sadece mevcut soru gibi atmak, ben test etmişti
xiaoming

-1

ssl istemci tarafı aşağıdaki durumda böyle bir istisna atacaktır tested Ben test etmişti),:

sunucudan istemci sertifikasının kimliğini doğrulaması istenir, ancak istemciden Genişletilmiş Anahtar Kullanımı'nın istemci yetkisini desteklemediği bir sertifika sağlar.


-3

Geri kalan API çağrıları alay ederken wireMock ile aynı sorunla karşı karşıya idi. Daha önce sunucuyu şu şekilde tanımlıyordum:

WireMockServer wireMockServer = null;

Ancak, aşağıda gösterildiği gibi tanımlanmalıdır:

@Rule 
public WireMockRule wireMockRule = new WireMockRule(8089);

Bu bir NullPointerExceptionsoruna neden olur , bu soruna değil.
Lorne Marquis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.