Jak prawidłowo zakończyć połączenie na socketach?

0

Witam,

Napisałem sobie chat w javie na socketach z wieloma klientami z tym że mam problem z zakończeniem połączenia.

-Wątek głowny servera ma otwarty ServerSocket który czeka na podłaczenie klientów. Oczywiscie jest to w bloku try/catch a w finally znajduje się ServerSocket.close().
-Kazdy klient ma własny wątek servera który nazwałem ClientHandling, ktory po otwarciu DataInputStream robi:

				while(true)
				{
					BroadcastMessage(nickname, input.readUTF());
				}
				
				
			} catch (IOException e) {
				try {
					input.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				e.printStackTrace();
			}
  • W watku klienta dzieje się w zasadzie to samo (zamkniecie socketa w exception) tyle ze odbiera tą wiadomosc ktora wywła funkcja Broadcast.. i wyswietla w GUI
    -Oprócz tego Client ma tez funkcje sendmsg ktora wysyla na output wiadomosc napisana w GUI.

Po odpaleniu programu w Eclipse, postawieniu servera, podlaczeniu klientow, wszystko dziala, gdy wylacze wszystkie okna eclipse pokazuje ze program wciaz dziala bo moge go zatrzymac czerwonym kwadracikiem.
Gdy wlacze program ponownie i proboje postawic server - leci exception:
java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind
więc podejrzewam ze moj port na ktorym stal socketserver wciaz jest zajety...
Jakies sugestie?

dziekuje z góry
[email protected]

0

problem masz pewnie dlatego ze watki nie są zabijanie.

Sprawdz

thread.setDaemon(true)

i link:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html#setDaemon(boolean)

0

i mam to robic z kazdym watkiem? Moze byc w bloku catch?
Nigdy nie spotkalem sie z ta funkcja, ale moze dlatego ze za malo w watkach siedze :)

0

Przed, albo tuż po utworzeniu kolejnego wątku ustawiasz tą metodą aby aplikacja była zamykana mimo działania wątków oznaczonych jako "demony". Wątek taki jest traktowany wtedy jako usługa, która jest tak długo potrzebna jak długo pozostałe wątki aplikacji działają (przynajmniej jeden z nich nie oznaczony jako demon). Krótko mówiąc poleceniem tym ustawiasz wątek jako usługowy, nie mający racji bytu samodzielnie. Kiedy aplikacja zamknie wątek podstawowy (lub wątki), to zostanie zamknięta. Alternatywnie możesz też ręcznie przerwać wszystkie wątki jakie stworzyłeś dla każdego klienta w momencie w którym odbierzesz polecenie zamknięcia (np. głównego okna).

0

Wszystko działa, dziękuję Wam za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1