Witam,
Mam nastepujacy problem.
Tworze polaczenia siecowe TCP za pomoca gniazd Socket. Polaczen takich mam wiele w osobnych watkach. Na poczatku po odpaleniu programu jest wszytstko ladnie pieknie, a po pewnym czasie zaczynaja sie wysypywac wyjatki BindException. Co sie okazuje... Gniazda pozostawiaja po sobie otwarte porty (zamykaja je z opoznieniem albo w ogóle... tego nie wiem). Dzieje sie to mimo ze wszystkie strumienie i gniazda zamykam metoda close(). Po pewnym czasie dzialania programu wszystkie porty sa otwarte i nowe watki nie moga otworzyc nowycyh gniazd (stad BindException). O co wiec chodzi? Czy mozna w Javie wymusic natychmiastowe zamkiniecie portu po zamknieciou gniazda?
Prosze o pomoc..
Może spróbuj po zamknięciu gniazda ręcznie odpalić garbage collectore'a, chociaż nawet nie jestem pewien, czy to jest możliwe. Chyba taka funkcja finalize() była, czy coś w tym rodzaju.
Pozdrawiam
Czytamy sobie manuala:
Once a socket has been closed, it is not available for further networking use (i.e. can't be reconnected or rebound). A new socket needs to be created.
Zatem znacznie lepszym rozwiązaniem jest stworzenie puli Socketów. Obiekt pobiera socket wykonuje operacje po czym zwraca socket do puli :)
Jeżeli jednak już potrzebujesz zamknąć socket to zawsze możesz go otworzyć na nowo Tworząc nowy obiekt:
try {
Socket s = new Socket("192.168.1.3", 80);
System.out.println(s.isConnected());
s.close();
s = new Socket("192.168.1.3", 80); //ten sam port i się nie wywala
System.out.println(s.isConnected());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
No i jeszcze pozostaje problem synchronizacji. Poza tym sprawdź czy obiekty Socket nie są statyczne.
Koziołek napisał(a)
Czytamy sobie manuala:
Once a socket has been closed, it is not available for further networking use (i.e. can't be reconnected or rebound). A new socket needs to be created.
Zatem znacznie lepszym rozwiązaniem jest stworzenie puli Socketów. Obiekt pobiera socket wykonuje operacje po czym zwraca socket do puli :)
Jeżeli jednak już potrzebujesz zamknąć socket to zawsze możesz go otworzyć na nowo Tworząc nowy obiekt:
try {
Socket s = new Socket("192.168.1.3", 80);
System.out.println(s.isConnected());
s.close();
s = new Socket("192.168.1.3", 80); //ten sam port i się nie wywala
System.out.println(s.isConnected());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
No i jeszcze pozostaje problem synchronizacji. Poza tym sprawdź czy obiekty Socket nie są statyczne.
No tak... ale w tym przypadku port 80 to jest port po stronie serwera hen hen daleko... z ktorym sie laczysz, a ja mam problem z portami po mojej stronie - klienta, ktore sa niejawnie wybierane. I wcale nie probuje robic reconnecta albo rebounda na sockecie. Po prostu tworze nowy socket operatorem new i tyle a potm go zamykam metoda close() i w tym momencie port lokalny po mojej stronie pozostaje otwarty...
??
w momencie zamkniecia socekta wszystkie porty ktore uzywasz do komunikacji rowniez powiny byc zamkniee. zamknij socketa w catch ;] gdzie wyrzuca ci wyjatki