Java connection timeout

Java connection timeout
2008-01-28T18:35:55+01:00
2008-01-29T21:14:06+01:00
2022-11-07T11:30:35+01:00
XmIsTeR
Most egy olyan programrészleten dolgozom ami végigmegy egy adatbázisban tárolt címeken, mind1ikhez csatlakozik és adatokat gyűjt.
A probléma, hogy ha időtúllépés van, egyszerűen nem tudom normálisan lekezelni. A catch-ben lévő kódok lefutnak, kiíratom a hibákat konzolra, de nem tudom megszakítani a kapcsolódási kísérleteket, ha close()-t hívok meg a socket-re, azt írja, hogy már le van zárva, és csak folyamatosan írogatja ki, hogy timeout. Próbáltam megkerülni a dolgot, hogy egy InetAddress-es isReachable metódussal leellenőrzöm a távoli gépeket, de a nagy részén az echo port blokkolva van a tűzfalon, szal ez se jó.
Mutasd a teljes hozzászólást!
sock = null; try { System.out.println(reqs.size() + " Kapcsolódás: (" + (Hub.curr+1) + "/" + Hub.Count() + ")" + currhub.getAddr()); sock = new Socket(currhub.getHost(), currhub.getPort()); Request req = new Request(this, sock, currhub); // ha idaig eljut a vegrehajtas akkor itt mar tuti, hogy letrejott a kapcsolat // mostmar nyugodtan mehet a mapba reqs.put(sock, req); } catch (Exception e) { // ha itt vagyunk akkor valamiert nem jott letre a kapcsolat System.out.println("Bot error: " + e.toString()); // ha nem null a sock akkor megprobaljuk bezarni if (sock != null) { try { socket.close(); } catch (IOException ioe) { } } // nem kell removeReq mert ha itt vagyunk akkor nem volt reqs.put(...) sem }
Mutasd a teljes hozzászólást!

  • Ha nem sikerul a kapcsolodas, nem kell lezarni a kapcsolatot!

    Honnan iratod ki, hogy timeout?
    Mutasd a teljes hozzászólást!
  • biztositani kell az eroforrasok felszabaditasat.
    hasznalj try,catch,finally szerkezetet.

    Socket socket = null; try { socket = ... } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null) { try { socket.close(); } catch (IOException ioe) { } } }

    ha egy ciklusban van az egesz akkor a hiba jellegetol fuggoen vagy visszateres legyen, vagy kis varakozas utan uj proba.
    Mutasd a teljes hozzászólást!
  • Most így néz ki:

    try { System.out.println(reqs.size()+" Kapcsolódás: ("+(Hub.curr+1)+"/"+Hub.Count()+")"+currhub.getAddr()); reqs.put(sock=new Socket(currhub.getHost(),currhub.getPort()),new Request(this,sock,currhub)); } catch ( Exception e) { System.out.println("Bot error: "+e.toString()); removeReq(sock); }
    A removeReq pedig:

    public void removeReq(Socket sock) { System.out.println(reqs.size()+" Kapcsolat vége: "+sock.toString()); try { sock.close(); } catch (IOException e) { System.out.println("Bontás hiba!"); } finally { reqs.remove(sock); System.out.println(reqs.size()); Next(true); } }
    Azért nem finally-ba teszem a removeReq-et, mert még szükségem van rá amíg az adatokat összeszedem. Azért ez a módszer, mert egyszerre több szerverhez csatlakozok, ezzel is gyorsítva a programot.
    Mutasd a teljes hozzászólást!
  • sock = null; try { System.out.println(reqs.size() + " Kapcsolódás: (" + (Hub.curr+1) + "/" + Hub.Count() + ")" + currhub.getAddr()); sock = new Socket(currhub.getHost(), currhub.getPort()); Request req = new Request(this, sock, currhub); // ha idaig eljut a vegrehajtas akkor itt mar tuti, hogy letrejott a kapcsolat // mostmar nyugodtan mehet a mapba reqs.put(sock, req); } catch (Exception e) { // ha itt vagyunk akkor valamiert nem jott letre a kapcsolat System.out.println("Bot error: " + e.toString()); // ha nem null a sock akkor megprobaljuk bezarni if (sock != null) { try { socket.close(); } catch (IOException ioe) { } } // nem kell removeReq mert ha itt vagyunk akkor nem volt reqs.put(...) sem }
    Mutasd a teljes hozzászólást!
  • Ez nagyjából jónak tűnik, de valamiért bekeverednek a dolgok. Szal ugye egy új Request létrehozásakor egyszerre kapja meg a socket-et és a currhub-ot, és mivel a socket címe és portja a currhub-ból jött elvileg egyeznie kellene végig, de előfodulnak olyanok, hogy a socket-ből kiíratott cím más mint amit a currhub tartalmaz, és nem igazán vágom, hogy hogyan lehetséges ez...
    Mutasd a teljes hozzászólást!
  • Rájöttem :) Mire a socket-en átlépett már a currhub megváltozhatott. Az eredeti kérdés megoldásáért jár a pont Hienanak.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd