26. februar 2004 - 00:56Der er
15 kommentarer og 3 løsninger
eclipse måske skjult proces
Hej eksperter.
Jeg er i gang med et kursus om distribuerede systemer og koder nu nogle klient server eksempler i java.
Jeg bruger med stor tilfredshed ide'et eclipse, hvilket virker rigtig godt - omend endnu kun har styr på et fåtal af funktionerne.
Nu til sagen - jeg har en klasse "Server", hvori jeg opretter et ServerSocket objekt. Til konstruktøren angiver jeg port 8000 som argument. Klassen opretter og igangsætter herefter en tråd, i det en klient opnår kontakt til serveren. Trådden indeholder en uendelig løkke, som lytter på input fra klienten
Jeg har held til at køre mit Server-program en enkelt gang, men hvis jeg efterfølgende forsøger at køre programmet igen, får jeg følgende fejlmeddelelse:
java.net.BindException: Address already in use at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:331) at java.net.ServerSocket.bind(ServerSocket.java:318) at java.net.ServerSocket.<init>(ServerSocket.java:185) at java.net.ServerSocket.<init>(ServerSocket.java:97) at Server.listen(Server.java:21) at Server.main(Server.java:39)
Mit eget bud, går på at jeg ikke får lukket processen (dvs. Server.class) ordentligt ned, altså at programmet kører i baggrunden.
Er der nogen her, der kan fortælle mig om jeg er på rette spor, og hvis ja, hvordan jeg så får set og stoppet den skjulte proces.
jeg må lige slå fast, at jeg ikke er for smart til det her - vælter ret meget rundt.
Jeg lukker ikke programmerne eksplicit ved en handling, men kan tilgengæld se i min eclipse-konsol, at de gange jeg har kørt et serverprogram er det efterfølgende blevet "terminated". Jeg når aldrig ned til socket.close, da mit serverprogram venter i en uendlig løkke på det tidspunkt. Er lige ved at teste med for-løkke nu, og derefter et socket.close()
Du kan godt stadig bruge en while. Men du skal bare på en eller anden måde kunne terminere den. Det kan du gøre vha. en boolean, der er sat til false, men når tråden skal stoppe bliver den sat til true. Hvis du så tester på denne booleans værdi i løkken kan du stoppe løkken, og dermed udføre et kald til socket.close()
public void run() { boolean requestStop = false; while (!requestStop) { if (!input-fra-klient-er-noget-bestemt(f.eks. bye eller noget lignende)) { //udfør hvad der skal udføres } else { requestStop = true; } } socket.close(); }
normalt ordner man det ved at åbne for 2 porte - en offentlig port, som skal håndtere den generelle server - og en anden, privat, port hvor serveren kan modtage "Kontrol"-beskeder - f.eks. "Server Shutdown"...
Så er kunsten at skrive et program, som transmiterer til den private port "STOP" - hvorefter serveren bryder ud af sin løkke - lukker sine porte og laver anden oprydning af ressourcer - og derefter afsluttes :-)
man kan også lavet det som rasmus's indlæg - hvor man både modtager normal og "kontrol" trafik på samme port -- man skal så bare sørge for at der ikke bliver mulighed for at slukke serveren, utilsigtet, ved at der bliver sendt en "normal-tekst" besked som bliver fortolket som en kontrol-besked...
anve_v >> mange gange (især da jeg var med på prototypen til expNOTE projektet) kom jeg til den erkendelse at win2000 kunne holde en port busy i op til 5 min. efter programmet blev TERM ...Mildest talt ret irriterende :-/... For jeg ville da også mene at der huritgt blev ryddet op i nogle ressourcer der...
Jeg kom frem til, at der lå server programmer der stadig var aktive. Skulle lige finde ud af, at jeg skulle lukke dem fra konsollen. Da de først var termineret her, blev porten også frigjort.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.