Avatar billede dresen Nybegynder
26. februar 2004 - 00:56 Der 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.

På forhånd tak
Avatar billede bearhugx Nybegynder
26. februar 2004 - 01:10 #1
når du at få kørt en socket.close() ??
Avatar billede dresen Nybegynder
26. februar 2004 - 01:36 #2
nej ....
Avatar billede dresen Nybegynder
26. februar 2004 - 01:48 #3
Jeg har en uendelig løkke der lytter på en input stream, så jeg når aldrig til socket.close()
Avatar billede rasmusbg Nybegynder
26. februar 2004 - 01:52 #4
Hvad gør du, når du vil lukke serverprogammet?
Avatar billede bearhugx Nybegynder
26. februar 2004 - 01:52 #5
Du skal huske inden du lukker applikationen at lukket socketen igen -- ellers vil den bare stå åben (og derved være i brug)....
Avatar billede dresen Nybegynder
26. februar 2004 - 02:14 #6
hej.

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()
Avatar billede rasmusbg Nybegynder
26. februar 2004 - 02:20 #7
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()
Avatar billede rasmusbg Nybegynder
26. februar 2004 - 02:26 #8
Din run()-metode kan se nogenlunde således ud:

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();
}
Avatar billede bearhugx Nybegynder
26. februar 2004 - 02:26 #9
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 :-)
Avatar billede bearhugx Nybegynder
26. februar 2004 - 02:29 #10
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...
Avatar billede arne_v Ekspert
26. februar 2004 - 09:13 #11
Hvis Eclipse melder at server programmet er termineret, så bør
porten frigøres uanset om close bliver kaldt eller ej.

Jeg har imidlertid før oplevet at det tog lidt tid førend
en port var klar til genbrug.

Jeg har aldrig haft problemet på Windows.

Men det tog flere minutter på Solaris.

Du kan jo evt. prøve at eksperimentere lidt på dit system.

Selvom man implementerer en pæn nedlukning, så kan ens server
jo crashede.
Avatar billede bearhugx Nybegynder
26. februar 2004 - 12:01 #12
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...
Avatar billede arne_v Ekspert
26. februar 2004 - 12:18 #13
OK - jeg har aldrig været så hårdt ramt af det på windows.

Men ihvertfald bør det først afklares om det er slow port reuse
der er problemet.

Det er en oplagt mulighed.
Avatar billede dresen Nybegynder
26. februar 2004 - 19:20 #14
Hej.

Tak for alle jeres svar.

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.

Jeg har dog stadig store problemer med mit program som jeg gerne vil have hjælp til:
http://www.eksperten.dk/spm/470353

Håber jeg kan få fordelt pointene rimeligt
Avatar billede dresen Nybegynder
26. februar 2004 - 19:21 #15
Nej hvor jeg gøgler - svarer på eget spørgsmål :)

Er I ikke flinke at droppe svar!!!
Avatar billede rasmusbg Nybegynder
26. februar 2004 - 19:22 #16
svar
Avatar billede arne_v Ekspert
26. februar 2004 - 22:00 #17
svar
Avatar billede bearhugx Nybegynder
27. februar 2004 - 01:55 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB