ServerSocket.accept() abbrechen

Status
Nicht offen für weitere Antworten.

MacMallow

Mitglied
Hi zusammen!

Momentan stehe ich gerade ziemlich aufm Schlauch und hoffe, dass mir hier irgendjemand helfen kann. Ich schreibe im Moment ein kleines Programm, welches u.a. eine Serverfunktionalität haben, also eingehende Verbindungen entgegennehmen soll. Dazu habe ich einen Thread mit folgender run()-Methode:

Java:
public void run() {
		try {
			serverSocket = new ServerSocket(port);
			while(isListening) {
				socket = serverSocket.accept();
				Thread connectionThread = new ConnectionThread(this, socket);
				connectionThread.start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
Der Klick auf einen Button löst nun eine Action aus, welche den Thread startet. Soweit läuft alles wie gewollt. Mein Problem ist nun, dass es auch möglich sein soll, den Thread auf die gleiche Weise wieder zu stoppen, also durch Klick auf einen Button. Die dazugehörige Action soll einfach "isListening" auf false setzen, wodurch die Schleife beendet wird. Da serverSocket.accept() aber blockiert, wird die Bedingung für die Schleife jedoch nicht geprüft, bis eine Verbindung eingegangen ist und der Thread läuft einfach weiter. Wie kann ich also diese "Blockade" umgehen?

Schon mal danke im Vorraus.
 
S

Spacerat

Gast
Ich weiss nicht ob es in diesem Stadium des Sockets noch möglich ist, ein SocketTimeout zu setzen. So ein SocketTimeout sorgt dafür, das darauf nur eine bestimmte Zeit gelauscht wird. Normalerweise setzt man die Zeit aber vor "accept()".
 

MacMallow

Mitglied
Erst einmal danke für die antworten. Socket.close() schließt zwar den Socket, wirft mir aber folgende Exception:

java.net.SocketException: socket closed
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(Unknown Source)
at java.net.ServerSocket.implAccept(Unknown Source)
at java.net.ServerSocket.accept(Unknown Source)
at connection.ServerThread.run(ServerThread.java:31)

(in Zeile 31 befindet sich socket = serverSocket.accept();)
 

FArt

Top Contributor
ServerSocket (Java 2 Platform SE v1.4.2)

Erst einmal danke für die antworten. Socket.close() schließt zwar den Socket, wirft mir aber folgende Exception:

java.net.SocketException: socket closed
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(Unknown Source)
at java.net.ServerSocket.implAccept(Unknown Source)
at java.net.ServerSocket.accept(Unknown Source)
at connection.ServerThread.run(ServerThread.java:31)

(in Zeile 31 befindet sich socket = serverSocket.accept();)

Gut so, vergiss "while is listening"...
 
Zuletzt bearbeitet:
S

SlaterB

Gast
was heißt hier aber, ist doch ok,
wenn du die Exception nicht magst, kannst du sie abfangen und gegebenenfalls ignorieren,
das try/ catch musst du ja eh schon schreiben
 

Illuvatar

Top Contributor
Eine Alternative wäre nio zu verwenden. Da kann der Vorgang dann einfach mit Thread#interrupt abgebrochen werden.

Ich hab das grad eben mal für mich ausprobiert, dabei ist bisschen Code entstanden. Vielleicht hilfts dir ja was ;)
Java:
import java.net.*;
import java.nio.channels.*;

public abstract class TestServerSocket implements Runnable
{
  private static final TestServerSocket[] IMPLEMENTATIONS = new TestServerSocket[]
          {new TestServerSocketImpl1(), new TestServerSocketImpl2()};
          
  public static void main(String[] args)
  {
    for (TestServerSocket test : IMPLEMENTATIONS) {
      System.out.println("\n");
      System.out.println(test);
      try {
        test.init();
      } catch (Exception e) {
        e.printStackTrace();
        continue;
      }
      
      Thread thread = new Thread(test);
      thread.start();
      
      pause();
      
      System.out.println("Interrupting...");
      thread.interrupt();
      
      pause();
      
      System.out.println("Closing...");
      try {
        test.closeSocket();
      } catch (Exception e) {
        e.printStackTrace();
        continue;
      }
    }
  }

  private static void pause()
  {
    try {
      Thread.sleep(2500);
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    }
  }
  
  public abstract void init() throws Exception;
  public abstract void closeSocket() throws Exception;
}

class TestServerSocketImpl1 extends TestServerSocket
{
  private ServerSocket ss;
  private ServerSocketChannel ssc;
  
  public void init() throws Exception
  {
    ssc = ServerSocketChannel.open();
    ss = ssc.socket();
    ss.bind(new InetSocketAddress(12452));
  }
  
  public void run()
  {
    try {
      ssc.accept();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  
  public void closeSocket() throws Exception
  {
    ss.close();
  }
}


class TestServerSocketImpl2 extends TestServerSocket
{
  private ServerSocket ss;
  
  public void init() throws Exception
  {
      ss = new ServerSocket(12453);
  }

  public void run()
  {
    try {
      ss.accept();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void closeSocket() throws Exception
  {
    ss.close();
  }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H ServerSocket.accept() unterbrechen Netzwerkprogrammierung 3
T ServerSocket.accept Rückgabetyp casten Netzwerkprogrammierung 3
G ServerSocket.accept() überschreibt IP-Adresse Netzwerkprogrammierung 4
C serversocket.accept() klappt nicht Netzwerkprogrammierung 10
dayaftereh serverSocket.accept(); Wecken Netzwerkprogrammierung 2
E Custom E Mail Adresse mithilfe Serversocket oder ähnliches Netzwerkprogrammierung 21
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
D ServerSocket - Socket Verbindungsart Netzwerkprogrammierung 3
J 1 Socket - 2 Serversocket Netzwerkprogrammierung 4
J Client - Serversocket Netzwerkprogrammierung 1
Seikuassi Socket ServerSocket mehrmals erzeugen Netzwerkprogrammierung 1
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
J ServerSocket sauber beenden Netzwerkprogrammierung 3
TheJavaKid ServerSocket beendet mit PuTTy Netzwerkprogrammierung 9
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
4 Socket Kann kein ServerSocket erstellen Netzwerkprogrammierung 4
D Socket ServerSocket Push Netzwerkprogrammierung 5
Tobse HTTP ServerSocket HTTP Netzwerkprogrammierung 4
X FAQ Frage - Netzwerkgrundlagen - ServerSocket und Socket Netzwerkprogrammierung 4
M Wahrnehmen, dass ServerSocket geschlossen wurde Netzwerkprogrammierung 14
T ServerSocket bleibt beim lesen von Input hängen Netzwerkprogrammierung 2
Schandro Herausfinden ob hinter einem Port bereits ein ServerSocket steckt Netzwerkprogrammierung 2
2 Class mit ServerSocket erbt von Thread? Netzwerkprogrammierung 3
T Java Socket und ServerSocket über Internet-IP? Netzwerkprogrammierung 9
G Frage zu Serversocket-Beispiel aus der FAQ Netzwerkprogrammierung 17
D Komisches Fenster bei Serversocket Netzwerkprogrammierung 2
M Kommunikation zwischen ServerSocket und Socket Netzwerkprogrammierung 2
F ServerSocket im internet zugänglich machen Netzwerkprogrammierung 15
H ServerSocket -> Zugriff nur von localhost Netzwerkprogrammierung 6
P Serversocket schmeißt immmer EOFEXCEPTION Netzwerkprogrammierung 2
A serversocket soll anfrage vom handy entgegennehmen Netzwerkprogrammierung 4
P Problem mit Socket und ServerSocket Netzwerkprogrammierung 2
S ServerSocket merkt nicht, wenn keiner mehr da ist Netzwerkprogrammierung 8
J ServerSocket vs. DatagramSocket Netzwerkprogrammierung 2
A ServerSocket prinzipielle Frage Netzwerkprogrammierung 5
D Problem ServerSocket global Netzwerkprogrammierung 3
J ServerSocket schließen / öffnen im Programmverlauf Netzwerkprogrammierung 4
G einfache Frage zu ServerSocket ... Netzwerkprogrammierung 5
R Socket bei server.accept(); gehts nicht weiter Netzwerkprogrammierung 2
C Socket Identifikation des clients nach der accept() Methode Netzwerkprogrammierung 2
G "Address already in use" accept() abbrechen? Netzwerkprogrammierung 4
X Java6 - RMI - "SocketTimeoutException: Accept timed out Netzwerkprogrammierung 6
J Socket.Accept() unterbrechen? Netzwerkprogrammierung 7
J server.accept() Netzwerkprogrammierung 10
N Server accept-Methode zeitlich begrenzen Netzwerkprogrammierung 2
M den Server aus seinem accept-Zustand holen Netzwerkprogrammierung 3
J server.accept() unterbrechen Netzwerkprogrammierung 10
F Socket Verbindungsaufbau abbrechen Netzwerkprogrammierung 3
M Problem: connection abbrechen und login erkennen Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben