Socket Server-Socket wiederholt starten

alihallo

Neues Mitglied
Guten Tag,

ich arbeite momentan an einem Projekt. Da ich momentan wirklich nicht mehr weiterweiß habe ich mir gedacht vielleicht kann ich bei Euch Hilfe bekommen.

Ich muss im Voraus sagen, dass ich in der Richtung noch nie etwas gemacht habe und ich mir mit Hilfe einiger Tutorials das folgende zusammengebaut habe.

Es geht darum: Sobald ich einen Button drücke, stellt der "Server" sich in Bereitschaft (d.h. er geht in eine Endlosschleife) und lauscht an dem Port 1234. Sobald nun ein anderer PC, ein Client, an diesen Port/IP eine Nachricht schickt, empfängt der Server diese, speichert sie ab. Das funktioniert soweit.
Ich befinde mich nun allerdings immer noch in dem Menü, das sich jetzt neu aufbaut und die eben empfangene Nachricht mit einbindet.
Soweit läuft alles einwandfrei.

Jetzt allerdings soll der Button ein zweites mal gedrückt werden, sodass der Server ein zweites mal in Bereitschaft geht und der nächste, also ein dritter PC wieder eine Nachricht an ihn schicken kann. Also im Prinzip einfach das, was bereits funktioniert, nur eben nocheinmal!

Nun bekomme ich allerdings die Meldung

Java:
java.net.BindException: Address already in use: JVM_Bind

Ich weiß nicht wie ich das Problem lösen kann, bin hier am verzweifeln. Ich bin der Meinung das ich den Server, den Client, einfach alles sauber schließe, sodass ich es doch einfach ein zweites mal öffenen könnte!?

Hier ein paar relevante Auszüge:


Wenn ich den Button drücke wird folgendes ausgelöst:
Java:
		    spielerWartenButton.addSelectionListener(new SelectionAdapter() 
		    {
		        public void widgetSelected(SelectionEvent e )
		        {
		        	try 
		        	{		        		
		        		String[] paraAngekommen = new String[2];
		                        
                                        //Hier die entscheidende Methode aufSpielerWarten()
		        		paraAngekommen = aufSpielerWarten();
		    			
                                        //Der nullte Parameter ist die Nachricht, der erste ist "1337"
		        		if(Integer.parseInt(paraAngekommen[1]) == 1337)
		        		{
			        		ipListe[spielerZaehler] = paraAngekommen[0];
			        		spielerZaehler++;
		        		}
		        		
						
					} catch (IOException e2) 
					{
						e2.printStackTrace();
					}

		        	try 
		        	{
			            neuesSpielMenue(darstellung);
			            	
		    		} catch (IOException e2)
		    		{
		    			System.out.print(e2);
		    		}

		        }


Hier die aufgerufene Methode aufSpielerWarten() die den Server in Bereitschaft versetzt

Java:
public static String[] aufSpielerWarten() throws IOException
	{
		ServerSocket server = new ServerSocket(1234);
		
		while(true)
		{
			String[] uebergabe = new String[5];
			Socket client = server.accept();

		    Scanner     input  = new Scanner( client.getInputStream() );
		    PrintWriter output = new PrintWriter( client.getOutputStream(), true );

			for(int i =0; i<2; i++)
			{
				uebergabe[i] = input.nextLine();
			}
							
			output.write(uebergabe[1]);
			output.flush();
			input.close();
			output.close();
			
			if(Integer.parseInt(uebergabe[1]) == 1337)
			{
				System.out.println("Server: Bestätigung erhalten");
				return uebergabe;
			}
		}
	}

Ich drücke also den Knopf, der Server wartet.
Daraufhin führe ich ein anderes Java Programm (der Client) aus mit folgender Methode:

Java:
public static void main (String[] args)
	{

		try {
			Client client = new Client();
			if (client.eigeneIpSenden("10.1.30.179", 1234))
			{
				System.out.println("Client: Eigene IP gesendet!");
			}
		} catch (IOException e) {

			e.printStackTrace();
		}

Java:
public boolean eigeneIpSenden(String ipAdresse, int offenerPort) throws IOException
	{
		Socket socketIPsenden = new Socket (ipAdresse, offenerPort);
		Scanner     input  = new Scanner( socketIPsenden.getInputStream() );
	    PrintWriter output = new PrintWriter( socketIPsenden.getOutputStream(), true );
		
		output.println(Menue.eigeneIP());
		output.println("1337");
		output.flush();
		
		if(Integer.parseInt(input.nextLine()) == 1337)
		{

			output.flush();
			System.out.println("Client: Bestätigung empfangen!");
			socketIPsenden.close();
			input.close();
			output.close();
			
			return true;
		}
		return false;
	}

Das sind alle relevanten Daten. Wie gesagt, das ganze funktioniert, aber eben nur EINMAL.
Das ist ein riesen Problem für mich, weil ich an dieser Stelle einfach nicht weiterkomme.
Sobald ich es also den Button ein zweites mal klicke bekomme ich folgende Meldung:

Java:
java.net.BindException: Address already in use: JVM_BindException in thread "main" java.lang.NumberFormatException: null
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at netzwerk.Menue$4.widgetSelected(Menue.java:258)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at netzwerk.Menue.fensterErzeugen(Menue.java:81)
	at netzwerk.Menue.neuesSpielMenue(Menue.java:378)
	at netzwerk.Menue$4.widgetSelected(Menue.java:277)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at netzwerk.Menue.fensterErzeugen(Menue.java:81)
	at netzwerk.Menue.neuesSpielMenue(Menue.java:378)
	at netzwerk.Menue$2.widgetSelected(Menue.java:163)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at netzwerk.Menue.fensterErzeugen(Menue.java:81)
	at netzwerk.Menue.main(Menue.java:392)

Ich hoffe jemand kann mir weiterhelfen, vielen Dank schonmal im Voraus,

Alex
 
G

Gast2

Gast
Nur weil du den Socket in Java schließt heißt nicht das er sofort wieder verfügbar ist. Das liegt ganz wesentlich daran wie das unterliegende Betriebsystem den Socket im TCP/IP Stack wieder freigibt. Das kann unter Umständen schon mal ein paar Sekunden dauern.

Warum willst du den Socket denn überhaupt schließen? Du kannst doch auch einfach mit mehren Clients auf den gleichen Socket verbinden?

Ich würde mir an deiner Stelle einfach ein Framework wie Netty oder Mina zur Hand nehmen und darauf dann deine Applikation entwickeln.
 
S

SlaterB

Gast
bisher wird der server ja nichtmal mit close() geschlossen, da kann man höchstens hoffen dass der Garbage-Collector aufräumt,
mit server.close() funktioniert es bei mir:

Java:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        Runnable r = new Runnable()
            {
                public void run()
                {
                    try
                    {
                        while (true)
                        {
                            aufSpielerWarten();
                        }
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }

                }
            };
        new Thread(r).start();


        Thread.sleep(2000);
        client();
        client();
        client();

    }

    public static void client()
    {
        System.out.println("client");
        try
        {
            Client client = new Client();
            if (client.eigeneIpSenden("localhost", 5234))
            {
                System.out.println("Client: Eigene IP gesendet!");
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }


    public static String[] aufSpielerWarten()
        throws IOException
    {
        ServerSocket server = new ServerSocket(5234);

        while (true)
        {
            String[] uebergabe = new String[5];
            Socket client = server.accept();

            Scanner input = new Scanner(client.getInputStream());
            PrintWriter output = new PrintWriter(client.getOutputStream(), true);

            for (int i = 0; i < 2; i++)
            {
                uebergabe[i] = input.nextLine();
            }

            output.write(uebergabe[1]);
            output.flush();
            input.close();
            output.close();

            if (Integer.parseInt(uebergabe[1]) == 1337)
            {
                System.out.println("Server: Bestätigung erhalten");
                server.close();
                return uebergabe;
            }
        }
    }
}


class Client
{

    public boolean eigeneIpSenden(String ipAdresse, int offenerPort)
        throws IOException
    {
        Socket socketIPsenden = new Socket(ipAdresse, offenerPort);
        Scanner input = new Scanner(socketIPsenden.getInputStream());
        PrintWriter output = new PrintWriter(socketIPsenden.getOutputStream(), true);

        output.println("dummy IP");
        output.println("1337");
        output.flush();

        if (Integer.parseInt(input.nextLine()) == 1337)
        {

            output.flush();
            System.out.println("Client: Bestätigung empfangen!");
            socketIPsenden.close();
            input.close();
            output.close();

            return true;
        }
        return false;
    }
}


besser ist in der Tat den Server dauerhaft offen zu lassen, z.B. statische Variable
 

alihallo

Neues Mitglied
@fassy: Danke dir, ich schau mir das mit den Frameworks mal an, aber ich glaube für meine niedrigen Zwecke wäre das fast schon übertrieben, aber ich schau mal rein.

@SlaterB: Du kannst dir nicht vorstellen wie dankbar ich dir bin, sitzt hier nun seit 3 stunden an dem Problem und schreib hier alles um und am Schluss war die Lösung zwei Wörter... Vielen vielen Dank, es geht erstmal.

Aber da ihr beide empfohlen habt das ganze anders zu lösen mach ich mich mal direkt ran. Deshalb wärs wahrscheinlich am Besten wenn ihr den Thread noch offen lasst, ich komm bestimmt bald wieder bei so super Hilfe bei Euch :)


Vielen Dank, Alex
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
D Socket server auf Smartphone Netzwerkprogrammierung 9
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
A Socket Socket Server netcat Netzwerkprogrammierung 1
Shams Anfängerfrage zu Server-Socket-Kommunikation Netzwerkprogrammierung 2
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
precoc Server Socket Start / Stop Netzwerkprogrammierung 5
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
M SSl Socket Server und openssl key Netzwerkprogrammierung 3
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
Y client server socket via internet Netzwerkprogrammierung 8
E Socket HTTP-Server Netzwerkprogrammierung 6
Y server client socket verbindung übers internet aufbauen Netzwerkprogrammierung 8
S SSL Socket zu IRC Server aufbauen? Netzwerkprogrammierung 10
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
H Socket Socket verbindung mit einem TeamSpeak2 Server Netzwerkprogrammierung 5
P über Socket Kommando an Win2000-Server absetzen Netzwerkprogrammierung 12
N Über Socket an Linux-Server Kommandos absetzen? Netzwerkprogrammierung 4
B Server socket springt nicht gleich an Netzwerkprogrammierung 3
C Verbindung zum Server prüfen mit einem vorhandenem Socket Netzwerkprogrammierung 4
M TCP Socket und Server int senden und empfangen Netzwerkprogrammierung 6
W Socket Client-Server Verbindung. Wie Strings senden? Netzwerkprogrammierung 6
A http request per socket an apache server Netzwerkprogrammierung 5
M Vom Server per Socket Empfangen, aber wieviel Bytes? Netzwerkprogrammierung 11
D Server Socket läuft nicht -> java.net.SocketException: Netzwerkprogrammierung 4
D Habe 2 Probleme: Input eingabe und Multi Socket Server Netzwerkprogrammierung 2
R Websockets oder server sent events? Netzwerkprogrammierung 2
W Windows 2019-Server Dienste starten unter Nutzer Netzwerkprogrammierung 1
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Chat Server starten über GUI problem Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben