Zamknięcie serwera socket.io

0

Cześć

Napisałem serwer który przesyła Stringa do klienta. Mam teraz problem z zamknięciem tego serwera, jedyne rozwiązanie jakim się posługuję to zakończenie procesu odpowiedzialnego za serwer. Doczytałem, że muszę wywołać metodę socket.close() ale nie radzę sobie z obsługą wyjątku "NullPointerException", mam taki kod - serwer:

public class Zapis 
{

	public static Socket gniazdo;
	public static ServerSocket gniazdoSrw;
	public static void main(String[] args) 
	{
		new Zapis().zapis();
	}

	public void zapis()
	{
		
		try
		{
			gniazdoSrw = new ServerSocket(5000);
			
			while(true)
			{
			gniazdo = gniazdoSrw.accept();
			PrintWriter pisacz = new PrintWriter(gniazdo.getOutputStream());
			String zmienna1 = "test";
			pisacz.println(zmienna1);
			pisacz.close();
			}
		}catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	public void exit()
	{
		try
		{
		gniazdo.close();
		}catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}

Do tego klient, który to odbiera:

public class Odczyt 
{

	public static Socket gniazdo;
	public static void main(String[] args) throws InterruptedException
	{
		new Odczyt().odczyt();
		Zapis z1 = new Zapis();
		z1.exit();
	}

	public void odczyt()
	{
		try 
		{
			gniazdo = new Socket("127.0.0.1", 5000);
			BufferedReader czytacz = new BufferedReader(new InputStreamReader(gniazdo.getInputStream()));
			String zmienna1 = czytacz.readLine();
			System.out.println(zmienna1);
			czytacz.close();
		}catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}

Nie wiem nawet czy dobrze do tego podchodzę - z tego co zrozumiałem to muszę zamknąć gniazdo po stronie serwera, czyli to moja metoda exit. Chciałem ją wywołać w innej klasie (w tym przypadku miała zostać wywołana po odebraniu znaków z bufora) tak, żeby podpiąć to do przycisku w późniejszej wersji.

Zdaję sobie sprawę, że pewnie coś źle zrozumiałem ale już od jakiegoś czasu stoję w miejscu.

0

Jak wywalisz po prostu z klasy Odczyt te linijki z new Zapis() i z1.exit() to też nie działa?

0

@jarekr000000: Serwer spełnia swoje działanie ale chciałem mieć też metodę która go wyłączy/zamknie i ta metoda mi nie działa. Dostaję błąd:

at Siec.Zapis.exit(Zapis.java:42)
at Siec.Odczyt.main(Odczyt.java:15)
1

Ale jak? Chcesz od strony klienta położyć serwer? To niestety będzie bardziej skomplikowane.
Co ci się teraz nie zamyka?

EDIT:
Jak chcesz na żądanie wyłaczyć serwer to niestety zasadniczo musisz zrobić komunikację w drugą stronę i od klienta przez outputStream wysyłać tekst: "idź już spać. jest ciemno."
Niestety wtedy po stronie serwera będziesz miał dodatkowo inputStream i łatwo się możesz zakleszczyć. (jak oba serwer i klient bedą czekały na inputStreamie na to co drugi wyśle).

0

@jarekr000000: Tak jak napisałeś, źle podchodzę do tematu. To pytanie urodziło się kiedy chciałem po stronie serwera wprowadzić jakieś zmiany. Teraz wysyłam tekst "test" i jak chciałem zmienić to na coś innego to przy kompilacji dostaję komunikat javajava.net.BindException: Address already in use: JVM_Bind. Jedyne co wymyśliłem to ubicie serwera w menadżerze zadań (proces javaw.exe), wprowadzenie zmian i ponowne go uruchomienie.
Jest na to jakaś bardziej elegancka metoda, czy to w jaki sposób wyłączam serwer jest w miarę poprawne?

0

Wszystko jasne, poza drobnymi niescisłościami ( java.net.BindException: Address already in use to na pewno nie przy kompilacji dostajesz).
To jest normalne, że trzeba ubić stary process servera zanim się nowy wystartuje.
Czym ty programujesz, że musisz w jakiś menadżer zadań wchodzić?
Jeśli używasz notatnika to skończ ( potrzeba na to więcej doświadczenia) i zacznij jakiegoś javowego IDE używać. Wtedy ubijanie starego procesu jest proste. (W Intellij np. restart programu z nowym kodem to CTRL-F5).

0

@jarekr000000: Piszę na Eclipsie Oxygen i używam opcji SHIFT+F11 (Run as java application). Po takim odpaleniu serwer chodzi na komputerze i jedyne co przyszło mi do głowy to ubić go z Windowsowego menadżera zadań.
Da się to zrobić inaczej w eclipsie?

1

Szukasz czegoś co się nazywa Terminate and Relaunch.
A nawet bez tego to jak masz okno Output w Eclipse to był tam gdzie przycisk do ubijania (taki czerwony kwadrat - STOP).

0

@jarekr000000: Właśnie testuję samego "terminate", nigdy tego specjalnie nie używałem ale wygląda, że działa. Dziękuję za pomoc.

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