de-vraag
  • Klausimai
  • Žymos
  • Vartotojai
Pranešimai
Apdovanojimai
Registracija
Užsiregistravę gausite pranešimus apie atsakymus ir komentarus į savo klausimus.
Prisijungti
Jei jau turite paskyrą, prisijunkite ir patikrinkite naujus pranešimus.
Už pridėtus klausimus, atsakymus ir komentarus bus skiriami apdovanojimai.
Daugiau
Šaltinis
Redaguoti
Anoniminis naudotojas
Question

java.net.SocketException: Connection reset

Bandydamas skaityti iš lizdo gaunu tokią klaidą. Atlieku readInt() ant to InputStream ir gaunu šią klaidą. Nagrinėjant dokumentaciją galima daryti prielaidą, kad klientinė ryšio dalis uždarė ryšį. Šiame scenarijuje aš esu serveris.

Turiu prieigą prie kliento žurnalo failų ir jis neuždaro ryšio, o iš tikrųjų jo žurnalo failai rodo, kad ryšį uždarau aš. Ar kas nors numano, kodėl taip atsitinka? Ką dar reikėtų patikrinti? Ar taip nutinka, kai yra vietinių išteklių, kurie galbūt pasiekia ribas?


Atkreipiu dėmesį, kad turiu tokią eilutę:

socket.setSoTimeout(10000);

prieš pat readInt(). Tam yra priežastis (ilga istorija), bet tiesiog smalsu, ar yra aplinkybių, dėl kurių tai gali sukelti nurodytą klaidą? Mano IDE veikia serveris, ir atsitiko taip, kad palikau IDE užstrigusį pertraukos tašką, ir tada pastebėjau, kad mano IDE žurnaluose pradėjo rodytis lygiai tokios pačios klaidos.

Bet kokiu atveju, tiesiog paminėjau tai, tikiuosi, kad tai nėra raudona silkė. :-(

113 2008-09-15T13:36:42+00:00 3
 bluish
bluish
Redaguotas klausimas priešpietr lapkritis 2012 в 9:25
Programavimas
java
networking
sockets
connection
socketexception
Šis klausimas turi 1 atsakymas atsakymų anglų kalba, norėdami juos perskaityti prisijunkite prie savo paskyros.
 user207421
user207421
priešpietr lapkritis 2010 в 4:11
2010-11-29T04:11:56+00:00
Daugiau
Šaltinis
Redaguoti
#8455795

Galimos kelios priežastys.

  1. Kita pusė sąmoningai iš naujo nustatė ryšį tokiu būdu, kurio čia nekomentuosiu. Tai retai ir paprastai neteisingai daro taikomoji programinė įranga, tačiau tai nėra nežinoma komercinei programinei įrangai.

  2. Dažniau taip nutinka dėl to, kad rašoma į jungtį, kurią kita pusė jau normaliai uždarė. Kitaip tariant, taikomosios programos protokolo klaida.

  3. Ji taip pat gali būti sukelta uždarant lizdą, kai lizdo priėmimo buferyje yra neperskaitytų duomenų.

  4. Windows sistemoje 'programinės įrangos sukeltas ryšio nutraukimas', kuris nėra tas pats, kas 'ryšio atstatymas', atsiranda dėl tinklo problemų siunčiant iš jūsų pusės. Apie tai'yra "Microsoft" žinių bazės straipsnis.

 user207421
user207421
Redaguotas atsakymas priešpietr gegužė 2015 в 5:01
107
0
 erickson
erickson
popietr rugsėjis 2008 в 2:03
2008-09-15T14:03:55+00:00
Daugiau
Šaltinis
Redaguoti
#8455794

Ryšio atstatymas reiškia, kad buvo gautas TCP RST. Taip atsitinka, kai jūsų bendrakeleivis gauna duomenis, kurių negali apdoroti, o to priežastys gali būti įvairios.

Paprasčiausia, kai uždarote lizdą, o tada į išvesties srautą įrašote daugiau duomenų. Uždarydami lizdą pranešėte savo bendrakeleiviui, kad baigėte pokalbį, ir jis gali pamiršti apie jūsų ryšį. Kai vis tiek siunčiate daugiau duomenų į tą srautą, bendrakeleivis juos atmeta su RST, kad praneštų, jog jūsų neklauso.

Kitais atvejais tarpinė ugniasienė arba net pats nuotolinis kompiuteris gali pamiršti apie jūsų TCP ryšį. Taip gali atsitikti, jei ilgą laiką nesiunčiate jokių duomenų (įprastas laiko tarpas - 2 valandos) arba jei bendrakeleivis buvo perkrautas ir prarado informaciją apie aktyvius ryšius. Siunčiant duomenis vienu iš tokių neveikiančių ryšių taip pat bus siunčiamas RST.


Atnaujinta gavus papildomos informacijos:

Atidžiai išnagrinėkite, kaip elgiatės su SocketTimeoutException. Ši išimtis sukeliama, jei užblokuojant lizdo operaciją viršijamas nustatytas laiko limitas. Paties lizdo būsena nepasikeičia, kai išmetama ši išimtis, tačiau jei jūsų išimties tvarkytojas uždaro lizdą, o paskui bando į jį rašyti, jūs' pateksite į ryšio atstatymo būseną. SetSoTimeout() yra skirtas tam, kad galėtumėte švariai nutraukti skaitymo() operaciją, kuri priešingu atveju gali užsiblokuoti amžinai, nedarydami tokių nešvarių dalykų, kaip lizdo uždarymas iš kitos gijos.

 erickson
erickson
Redaguotas atsakymas popietr spalis 2014 в 4:20
44
0
 GEOCHET
GEOCHET
popietr rugsėjis 2008 в 1:45
2008-09-15T13:45:06+00:00
Daugiau
Šaltinis
Redaguoti
#8455793

Kai susiduriu su tokiomis keistomis problemomis, paprastai atsisėdu su tokia priemone kaip WireShark ir pasižiūriu į neapdorotus duomenis, perduodamus pirmyn ir atgal. Galite nustebti, kur viskas yra atjungiama, o jums apie tai pranešama tik tada, kai bandote skaityti.

15
0
Pridėti klausimą
Kategorijos
Visi
Technologijos
Kultūra / poilsis
Gyvenimas / Menai
Mokslas
Profesionalus
Verslas
Vartotojai
Visi
Naujas
Populiarus
1
Roxana Elizabeth CASTILLO Avalos
Registruota prieš 4 dienas
2
Hideo Nakagawa
Registruota prieš 5 dienas
3
Sergiy Tytarenko
Registruota prieš 6 dienas
4
shoxrux azadov
Registruota prieš 1 savaitę
5
Koreets Koreytsev
Registruota prieš 1 savaitę
DA
DE
EL
ES
FR
ID
IT
JA
KO
LT
LV
NL
PT
RO
RU
TR
ZH
© de-vraag 2022
Šaltinis
stackoverflow.com
pagal licenciją cc by-sa 3.0 nurodant autorystę