Avatar billede Simon Praktikant
29. september 2005 - 10:08 Der er 11 kommentarer og
1 løsning

hvorfor lukkes min socket?

Hej

Jeg bruger metoden getData(...) til at hente data via en Socket. Da den kaldes rimelig ofte har jeg ikke lyst til at oprette en Socket hver eneste gang. Derfor opretter jeg en Socket før jeg kalder metoden første gang, og overfører denne som parameter (mySocket).

Dette går fint første gang. Næste gang får jeg en exception når programmet kommer til "hostOut = new Buffere..." med beskeden "Socket is closed".

Hvorfor lukkes den, og kan jeg forhindre det, eller skal jeg designe mit program anderledes?


String getData(Socket mySocket,........)
{

mySocket = new Socket(myIP,80);
System.out.println("GetLogDataString 4");
staticSocket.setSoTimeout(10000);

hostOut = new BufferedWriter(new OutputStreamWriter(paramSocket.getOutputStream(),"UTF-8"));

hostIn = new InputStreamReader(paramSocket.getInputStream(),"UTF-8");
hostOut.write(request);
hostOut.flush();

int numberOfBytesToReadAhead = 1000;
char[] c = new char[numberOfBytesToReadAhead];
           
int n;
while((n = hostIn.read(c,0,numberOfBytesToReadAhead)) >= 0)
{
    response += new String(c,0, n);
};
hostIn.close();
hostOut.close();
}

return response;
}
Avatar billede arne_v Ekspert
29. september 2005 - 10:26 #1
mySocket = new Socket(myIP,80);

sætter mySocket til at pege på et nyt socket objekt inde i metoden

men den peger ssatdig på det samme efter return fra metoden

og det er noget rod

det bedste vil være at flytte den linie ud inden du kalder GetData

ellers skal du til at rode med noget "ref"
Avatar billede Simon Praktikant
29. september 2005 - 10:28 #2
ups, det var en copy-paste fejl.
linierne:
"mySocket = new Socket(myIP,80);
System.out.println("GetLogDataString 4");
staticSocket.setSoTimeout(10000);"
skal slet ikke være med her. De er heller ikke med i min egen kode.
Avatar billede Simon Praktikant
29. september 2005 - 10:29 #3
mySocket = new Socket(myIP,80);
System.out.println("GetLogDataString 4");
staticSocket.setSoTimeout(10000);

kaldes uden for metoden getData(...) og kun hvis mySocket == null
Avatar billede arne_v Ekspert
29. september 2005 - 10:30 #4
NB: glem lige alt om "ref" - jeg tænkte lige C# - Jav ahar ikke den mulighed

men flyt den Socket åben udenfor den metode
Avatar billede Simon Praktikant
29. september 2005 - 10:46 #5
Jamen jeg åbner den også uden for metoden :-( men får blot en exception på "Socket is closed" har de noget at gøre med at jeg i metoden closer hostIn og hostOut?
Avatar billede arne_v Ekspert
29. september 2005 - 10:48 #6
hvis du åbner den udenfor behøver du da ikke åbne den indenfor
Avatar billede arne_v Ekspert
29. september 2005 - 10:48 #7
tror jeg ikke
Avatar billede Simon Praktikant
29. september 2005 - 10:50 #8
nej det var også en copy-paste fejl at jeg har fået åbbet den indenfor. Det er kun er på eksperten at det er med. Jeg åbner den ikke indefor i min egen kode.
Avatar billede Simon Praktikant
29. september 2005 - 11:20 #9
Jeg har fundet ud at at Socket har en property som hedder "closed". denne bliver true når "hostIn.close();" er blevet kaldt. hmmm, skal "BufferedWriter" måske også udenfor? Det her virker åndsvagt
Avatar billede arne_v Ekspert
29. september 2005 - 11:58 #10
jeg tror at det nemmeste er at åbne og lukke streams udenfor og så sende dem med over i metoden
Avatar billede Simon Praktikant
16. august 2006 - 09:34 #11
takf or hjælpen, smid svar for point
Avatar billede arne_v Ekspert
16. august 2006 - 13:16 #12
ok
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