1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
2203
2203
EMPFEHLEN
-
Nachfolgend ein Stück meines Clientquellcodes. Obwohl ich den Socket schließe wird mir die Verbindung noch immer als existierend angezeigt. Mittels Windows:netstats kann ich auch sehen dass noch ein Port geöffnet ist. Sollte der nicht eigentlich nach dem Befehl socket.close() geschlossen werden?
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
in.close(); out.close(); oos.close(); sock.close(); if (debug == true) { log("Socket ist gebunden: " + sock.isBound()); log("Socket ist verbunden: " + sock.isConnected()); log("Socket ist geschlossen: " + sock.isClosed()); log("Socket Inputshutdown? " + sock.isInputShutdown()); log("Socket Outputshutdown? " + sock.isOutputShutdown()); }
PdmTalkClient: [Socket ist gebunden: true]
PdmTalkClient: [Socket ist verbunden: true]
PdmTalkClient: [Socket ist geschlossen: true]
PdmTalkClient: [Socket Inputshutdown? true]
PdmTalkClient: [Socket Outputshutdown? true]
-
hi,
bei mir funktioniert das so (auch mit netstat -a) besser:
public void close() {
try {
SOCKET.close();
SOCKET.shutdownInput();
SOCKET.shutdownOutput();
out.close();
streamReader.close();
connected = false;
}
catch(Exception e) {
e.printStackTrace();
}
}
LG
Andy
-
29.12.06 10:55 #3
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Wenn du den Port an den ein Socket gebunden ist möglichst schnell schließen möchtests könntest du mit einer entsprechenden SoLinger Einstellung am Socket das "close" TimeOut manipulieren.
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
package de.tutorials; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * <p> * TODO Description of the type * </p> * @author Thomas.Darimont */ public class SocketExample { /** * <p> * TODO Description of method * </p> * @param args */ public static void main(String[] args) { final ExecutorService server = Executors.newSingleThreadExecutor(); server.execute(new Runnable() { public void run() { try { ServerSocket ss = new ServerSocket(1984); Socket s = ss.accept(); s.setSoLinger(true,0); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } s.close(); ss.close(); } catch (IOException e) { e.printStackTrace(); } server.shutdownNow(); } }); final ExecutorService client = Executors.newSingleThreadExecutor(); client.execute(new Runnable() { public void run() { try { Socket socket = new Socket("localhost",1984); //socket.setSoLinger(true,0); reicht auf ServerSeite ;-) try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } socket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } client.shutdownNow(); }}); } }
Dann verschwindet der Port unmittelbar in der netstat -a Auflistung.
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Also wenn ich den Socket vor den eigentlichen In/Out Streams schließe, dann erhalte ich aber eine Exception!!
Wenn ich eine Socketverbindung von einem Client zu einem Server / ServerThread aufbaue, dann müsste es doch eigentlich reichen wenn der Client die Verbindung mittels sock.close trennt (die Streams werden meines Wissens nach gleich mitgekappt, aber nichts desto trotz schließe ich sie ja noch explizit), der Server erhällt einen Timeout (bei mir 2 Sekunden) und daraufhin müsste der Port doch geschlossen werden. Bei meinem Programm senden sowohl Server - Thread als auch Client ein sock.close() aber trotzdem ist der Port noch für eine gute Minute offen...
Gibt es nicht ein sock.StirbSofortAufDerStelleUndGibDenPortFrei()
Oder muss ich damit leben?
-
@Tom
Habe deine Antwort leider zu spät gelesen. Genau so funktionierts!
Danke
Ähnliche Themen
-
Socket aus anderem Thread schliessen
Von StehtimSchilf im Forum .NET Web und KommunikationAntworten: 4Letzter Beitrag: 25.06.10, 13:41 -
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 30.01.08, 10:24 -
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 29.01.08, 14:59 -
Server Socket und Client Socket
Von spiderman21 im Forum NetzwerkeAntworten: 1Letzter Beitrag: 22.10.07, 01:48 -
Socket schliessen
Von DerKleineVomSee im Forum JavaAntworten: 12Letzter Beitrag: 13.06.06, 15:52





Zitieren


Login





