SocketServer Problem

Status
Nicht offen für weitere Antworten.

Fraiser

Mitglied
Hallo, ich bräuchte mal eure Hilfe.

Hab eine Oberfläche, durch die mal per Button eine Socketserver Starten und stoppen kann.

Der SocketServer läuft in einem Thread.
Hier ein Auszug.

Code:
public void run()
   {
      try
      {
         while( !isInterrupted() )
         {
            while( connectionFailed )
            {
               if( sSocket == null )
               {
                  sSocket = new ServerSocket( _Port );
               }
               socket = sSocket.accept();
               is = socket.getInputStream();
               os = socket.getOutputStream();
               connectionFailed = false;
            }

            
              //hier ist noch eine "Endlosschleife, die auch auf bestimmtes Byte wartet
              ...
         }
      }
      catch( IOException e )
      {
         e.printStackTrace();
      }
      catch( Exception e )
      {
         e.printStackTrace();
      }
   }
}


Beim StartServer wird das auchgeführt:

Code:
server = new ServerThread(Integer.valueOf( jtf_serverPort.getText()));
         server.start();

Beim StopServer das:
Code:
server.interrupt();

Beim 2. Start des Server, meckert er rum: Address already in use: JVM_Bind

Versteh schon warum, aber wie kann ich das anders machen?
 

sparrow

Top Contributor
Mit Socket.accept() wartest du darauf, dass auf dem Port etwas eingeht.
Ich bin mir im Augenblick nicht sicher ob der Code an dieser Stelle wirklich abbricht wenn ein ein Interrupt augeslöst wird.
Setz mal ein System.out hinter die Schleife, also nach dem while(!isIterrupted), um herauszufinden ob überhaupt aus der Schleife herausgesprungen wird.

Außerdem würde ich die Sockets mit Socket.close() wieder dicht machen wenn sie nicht mehr gebraucht werden.


Gruß
Sparrow
 

Fraiser

Mitglied
sparrow hat gesagt.:
... um herauszufinden ob überhaupt aus der Schleife herausgesprungen wird.

Ja, Der ServerThread wird richtig unterbrochen.


sparrow hat gesagt.:
Außerdem würde ich die Sockets mit Socket.close() wieder dicht machen wenn sie nicht mehr gebraucht werden.

Ich denk hier liegt das Problem, denn interrupt() bricht ja den kompletten Thread ab.
Somit kommt ein socket.close() ja zu spät. Gibt ja keine Methode, die nach dem Interrupt aufgerufen wird. :?
 
G

Gast

Gast
Du kannst am Ende vom catch()-Block noch ein finally { sSocket.close(); } anhängen. Der finally Block wird immer durchlaufen.
 

sparrow

Top Contributor
Fraiser hat gesagt.:
Gibt ja keine Methode, die nach dem Interrupt aufgerufen wird. :?

Ähm.. doch.
Wenn Socket.accept() darauf reagiert wird es bestimmt eine Exception werfen, und in dem entsprechenden catch-Block zu dieser Exception kannst du den Socket dann zu machen.

http://java.sun.com/javase/6/docs/api/java/net/ServerSocket.html#accept()
 

Fraiser

Mitglied
Danke für eure Tipps, aber hat leider alles nix geholfen.
Hier mal der komplette Code des ServerThreads.

Also der Server läuft mit jedem Port einmal. Beim zweiten mal bringt er mir wie gesagt den:
java.net.BindException: Address already in use: JVM_Bind

Start des Servers jedesmal mit:
server = new ServerThread(Integer.valueOf( jtf_serverPort.getText()));
server.start();

stop mit:
server.interrupt();

Das Problem ist, dass er die Bedingung while( !isInterrupted() ) nie erreicht, weil in der noch eine Endlosschleife kommt. Weiss aber nicht, wie ich das anders machen soll.
Ich bräuchte also was, was den Thread komplett beendet und den Port freigibt.

Bin über Hilfe sehr dankbar!

Code:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerThread extends Thread implements Runnable
{
   private int _Port;
   private ServerSocket sSocket        = null;
   private Socket socket               = null;
   private InputStream is              = null;
   private boolean connectionFailed    = true;
   
   public ServerThread( int port )
   {
      _Port = port;
   }
   
   public void run()
   {
      try
      {
         while( !isInterrupted() )
         {
            // Verbinungen herstellen
            // bei Fehlern neuer Versuch
            while( connectionFailed )
            {
               if( sSocket == null )
               {
                  sSocket = new ServerSocket( _Port );
                  socket = sSocket.accept();
                  is = socket.getInputStream();
                  connectionFailed = false;
               }
            }
            // die eigentliche Arbeit des Servers

            int c = 0;
        
            // waiting for start-byte
            for( c = is.read(); c != -1 && c != 11; c = is.read() );

            // get data
            int byte1 = is.read();
            int byte2 = 0;
            boolean dataFinished = false;

            while( !dataFinished )
            {
               byte2 = is.read();
               if( byte1 == 28 && byte2 == 13 )
               {
                  break;
               }
               else
               {
                  byte1 = byte2;
               }
            }
            System.out.println( "COMPLETE" );
         }
      }
      catch( IOException e )
      {
         e.printStackTrace();
      }
   }
}


Hier auch gleich nochmal die ne TestMain

Code:
public class Testmain
{

   public static void main( String[] args )
   {
      try
      {
         ServerThread server = new ServerThread(888);
         server.start();
         Thread.sleep( 100 );
         server.interrupt();
//         server= new ServerThread(888);
//         server.start();
      }
      catch( InterruptedException e )
      {
        
         e.printStackTrace();
      }
      
   }
}

Mit der Testmain bleibt er bei socket.accept hängen.
is ja ok, denn accept(): The method blocks until a connection is made.

Aber auf Interrupt reagiert der nun nicht. :?
 

Fraiser

Mitglied
Ich habs nun erstmal über Reflection gemacht, den Socket von außen zu closen. Nicht schön, aber geht erstmal.

Vielleicht hat trotzdem noch jemand eine tolle Idee ;)
 

sparrow

Top Contributor
Genau das meinte ich als ich fragte ob die Enlosschleife wirklich beendet wird....
Also wird der Thread eigentlich gar nicht beendet.

Hier mal ein paar Änderungen.
Ist aber nicht getestet.

Code:
   public void run()
   {
      try
      {
         while( !isInterrupted() )
         {
            // Verbinungen herstellen
            // bei Fehlern neuer Versuch
            while( connectionFailed )
            {
               if( sSocket == null )
               {
                  sSocket = new ServerSocket( _Port );
                  socket = sSocket.accept();
                  is = socket.getInputStream();
                  connectionFailed = false;
               }
               // Hier prüfen wir auf Abbruch
               if (isInterrupted()
               {
                  break;
               }
            }
            // die eigentliche Arbeit des Servers

            int c = 0;
       
            // waiting for start-byte
            for( c = is.read(); c != -1 && c != 11; c = is.read() );

            // get data
            int byte1 = is.read();
            int byte2 = 0;
            boolean dataFinished = false;

            while( !dataFinished )
            {
               byte2 = is.read();
               if( byte1 == 28 && byte2 == 13 )
               {
                  break;
               }
               else
               {
                  byte1 = byte2;
               }
               // Vorsichtshalber prüfen wir hier
               // auch noch mal auf Abbruch
               if (isInterrupted())
               {
                  break;
               }
            }
            System.out.println( "COMPLETE" );
         }
         System.out.println("Port-Thread beendet ....");
         if (sSocket != null && (sSocket.isClosed() == false))
         { 
            System.out.print("Der Port ist noch offen, ich schließe ihn...  ");
            sSocket.close();
            System.out.print("done\n");
          }
      }
      catch( IOException e )
      {
         e.printStackTrace();
      }
   }
 

Fraiser

Mitglied
ServerSocket.accept() blockiert wirklich, bis eine Anfrage eines Clients eingeht.
Nach dem ein Client eine Anfrage gestellt hat, kann man auch isInterrupted() auswerten.

Ein Server, der durch accept blockiert ist, weil keine Anfrage eines Clients kommt, kann (nur?) beendet werden. wenn man den Socket schließt. Dies führt zu einer Exception "socket closed". Da muss man nun kucken was gemacht werden soll.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
DamienX Chat Socketserver/Client. wo ist das Problem? Netzwerkprogrammierung 2
P SocketServer im lokalen netzwerk suchen Netzwerkprogrammierung 2
S Socket SocketServer und Client machen Probleme Netzwerkprogrammierung 6
I Socket Problem mit den WebSocket Antworten der Discord API Netzwerkprogrammierung 0
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
C RMI Produzent-Verbraucher-Problem - Code review Netzwerkprogrammierung 12
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
S Problem bei dem Bluetoothverbindungsaufbau Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
M Netty - TCP Problem Netzwerkprogrammierung 4
L Socket Problem mit Server Netzwerkprogrammierung 1
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
M Socket CDI, Websocket reference Problem ! Netzwerkprogrammierung 2
Shams Problem mit Eventbus in Verbindung mit Server Netzwerkprogrammierung 0
G apache httpClient Problem. Netzwerkprogrammierung 5
H Problem mit ObjectStreams Netzwerkprogrammierung 3
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
D Socket BufferedWriter/Reader Problem Netzwerkprogrammierung 1
Maxim6394 Problem mit Socks5 Implementierung Netzwerkprogrammierung 0
C Handle Connection Problem Netzwerkprogrammierung 3
E HttpUrlConnection Cookie Problem Netzwerkprogrammierung 0
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
B Client/Server Connection Problem Netzwerkprogrammierung 2
G Problem mit STATIC-Verständnis Netzwerkprogrammierung 8
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
J Facelets Include Rendered Problem Netzwerkprogrammierung 2
J Socket Problem mit C++/Java Netzwerkprogrammierung 20
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 7
B Socket Problem mit Netzwerkchat Netzwerkprogrammierung 21
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
Maxim6394 ipv6 Problem Netzwerkprogrammierung 2
Maxim6394 Proxyserver Performance Problem Netzwerkprogrammierung 11
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 5
B RMI und Problem mit rmic-Tool Netzwerkprogrammierung 3
C FTP storeFileStream Problem Netzwerkprogrammierung 3
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
D JavaMail - Mailsabrufen Problem (imap) Netzwerkprogrammierung 12
J HTTP Übersetzung yahoo babelfish - Zeichensatz-Problem Netzwerkprogrammierung 6
D Apache CXF, JAX-WS Problem bei Arrays - einfacher Server Netzwerkprogrammierung 2
M Problem beim Datenempfang Netzwerkprogrammierung 2
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
D Thread problem Netzwerkprogrammierung 3
T Servlets JSP: Tomcat Problem Netzwerkprogrammierung 4
K Client - Server Problem Netzwerkprogrammierung 16
T RMI Problem Client-Server Netzwerkprogrammierung 2
P RMI Stub Problem Netzwerkprogrammierung 3
D Socket UDP Übertragungs Problem Netzwerkprogrammierung 7
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 2
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 6
D Problem mit ObjectInputStreams Netzwerkprogrammierung 10
D Socket Problem mit InputStreamReader Netzwerkprogrammierung 3
N CRC32 CheckSum Problem bei UDP Netzwerkprogrammierung 2
V Java Mail Api - IMAP Problem Netzwerkprogrammierung 6
P RMI Problem Netzwerkprogrammierung 4
I Problem bei Outputstreamerzeugung in anderer Klasse als Socket Netzwerkprogrammierung 5
S Socket Problem mit Objektübertragung Netzwerkprogrammierung 16
Shoox Reader / Writer Problem Netzwerkprogrammierung 2
S Problem mit 2 Serversockets unter Win XP Netzwerkprogrammierung 7
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
M RMI - Connection Problem Netzwerkprogrammierung 7
J Socket Client - Server Problem Netzwerkprogrammierung 4
M Socket Chat-Client-Problem Netzwerkprogrammierung 8
D Client Server Problem, Methode readline() löst SocketException "Connection reset" aus Netzwerkprogrammierung 8
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
T Problem bei Findung der richtigen Architektur Netzwerkprogrammierung 3
AlexSpritze Authentication Problem bei WebServices Netzwerkprogrammierung 4
J Socket Problem -Proxies Netzwerkprogrammierung 2
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
F Konzept Problem Netzwerkprogrammierung 12
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
J Client server problem Netzwerkprogrammierung 3
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
W RMI Problem Netzwerkprogrammierung 4
M Problem mit Server Netzwerkprogrammierung 5
N Socket Java server c# client problem Netzwerkprogrammierung 7
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
R RMI Hibernate Problem Netzwerkprogrammierung 4
Z RMI Problem Netzwerkprogrammierung 11
F RMI problem mit RMI Netzwerkprogrammierung 3
H Object Cast Problem nach Übertragung mit Log4j Netzwerkprogrammierung 5
H Log4j SocketAppender Problem Netzwerkprogrammierung 2
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
P Problem mit JOscarLib Netzwerkprogrammierung 6
0din SMTP Client - readline problem Netzwerkprogrammierung 4
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
W vista / win server 2003 netzlaufwerk problem Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben