2011-01-14 11 views
0

Ich habe den folgenden Code-Snippet:ServerSocket- Verhalten akzeptieren

if (servsock == null) { 
    System.out.println("HELLO1!"); 
    servsock = new ServerSocket(63456, 10); 
    System.out.println("HELLO2!"); 
} 
try { 
    System.out.println("HELLO3!"); 
    sock = servsock.accept(); 
} catch (Exception ex) { 
    if (servsock != null && !servsock.isClosed()) { 
     System.out.println("PICO1!"); 
     servsock.close(); 
    } 
    if (servsock != null && servsock.isClosed()) { 
     System.out.println("PICO2!"); 
     manager.log("SERVER SOCKET closed and nulled."); 
     servsock = null; 
    } 
    sock = servsock.accept(); 
} 
System.out.println("HELLO4!"); 
is = sock.getInputStream(); 
System.out.println("HELLO5!"); 
bis = new BufferedInputStream(is); 
System.out.println("HELLO6!"); 

Dieser Code in einem run() Methode des runnable ausgeführt wird, und wenn die Datei übertragen wurde, wird angenommen, jede Kommunikation zu stoppen.

Das Kuriose ist, dass es keine Schleife ist. Der Code akzeptiert, macht eine Dateiübertragung, aber ich verstehe nicht, warum der HELLO1 wieder auf meinem Bildschirm ist. Also, das zweite Mal, wenn ich versuche, diesen Code erneut auszuführen, gibt mir "Verbindung verweigert".

Die "10" war ein Hack von mir, aber der ursprüngliche Code, verwendet nie auch Backlog.

Irgendwelche Vorschläge bitte?

Der Code läuft die bisherige Ausführung ist, dass:

final IClientInterface clientInterface = client.getClient(); 
final prgHolder = new ProgHolder(); 
Pong ftppong = new Pong(); 
ftppong.setFileNames(bout64.toByteArray()); 
ftppong.setDstFolder(dstFolder); 
prgHolder.setName("pong"); 
prgHolder.setTask(pong); 
Thread t = new Thread(new Runnable() { 
    public void run() { 
     try { 
      IClientInterface.execute(prgHolder); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
}); 
t.start(); 

Das genaue Problem ist jetzt, dass wenn ich den neuen Serversocket (63456) Befehl erreichen, erhält der Kunde eine „Connection Refused“, aber das Programm im entfernten PC, ist weit offen und breiter Zuhörer! "netstat" bestätigt das!

Ich wiederhole (zweites Mal) das Programm von einem alternativen Fenster, übergibt alle Hallo-Nachrichten und schließt den Job ab!

Dann stoppt der Thread im entfernten PC und löst den Port 63456!

Warum schlägt es als Code fehl, akzeptiert aber eingehende Anfragen?

+0

Ok Ich habe den genauen Fehlerpunkt gefunden. Es ist nach dem Thread. Nach dem t.start(); Wo ich das mache: "Socket sock = new Socket (" distancemaching ", 63456); Der Code hungs genau dort. Direkt nach dem Thread. Nach der Theorie sollte ich die Server-Thread-Setup haben und der Client bekommt die Verbindung damit kleines snippet, richtig? Es scheint, dass es nicht funktioniert. – hephestos

+0

windows windows: kein problem. Windows-Linux als server, um verbindung zu akzeptieren, scheitert. – hephestos

Antwort

1

Basierend auf diesem Code sollten Sie HELLO1 nur einmal sehen. Es ist jedoch sehr wahrscheinlich, dass der Aufrufer dieses Codes in einer Schleife ist, ansonsten würde es keinen Sinn machen, den vorherigen Wert von servsock zu überprüfen.

Was wird das tun?

Wenn Sie eine Ausnahme erhalten, fahren Sie nicht fort, als ob es nicht passiert wäre.

Wenn Sie verstehen möchten, was Ihr Code tut, schlage ich vor, dass Sie einen Debugger verwenden, um durch Ihren Code zu gehen.

+0

der check ist dort angekommen, nachdem ich dieses verhalten gesehen habe, versuche es zu debuggen Sie haben einen Punkt über den Debugger. und die Schleife. Aber es gibt keine Schleife. Die gesamte runnable Klasse, wird in die run() und wird von einem Thread wie dieser Thread t = new Thread (Runnable); t.start aufgerufen(); HELLO1 ... 2 ... 3 ... perfekt .... 1 omg. Über Schleife werde ich überprüfen. – hephestos

Verwandte Themen