Client sendet nur, wenn das Socket geschlossen wird

mathiasj

Bekanntes Mitglied
Hallo,
ich schreibe gerade an einer kleinen Android App, bei der ich mich auch mit meinem Server verbinde... Aber da das irgendwie nicht funktioniert hat, habe ich eine Beispiel App geschrieben, die einfach eine einzelen Nachricht an den Server sendet.


Hier ist der Server:

Java:
public class Server {

public static void main(String[] args) {
    new Server().go();
}

public void go() {
    try {
        @SuppressWarnings("resource")
        ServerSocket serverSocket = new ServerSocket(5000);
        while(true) {
            Socket clientSocket = serverSocket.accept();
            Thread t = new Thread(new ClientHandler(clientSocket));
            t.start();
            System.out.println("Connection");
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
}

public class ClientHandler implements Runnable {
    private BufferedReader br;
    private Socket socket;
    private BufferedWriter bw;

    public ClientHandler(Socket clientSocket) {
        try {
            socket = clientSocket;
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
        try {
            String nachricht;
            while((nachricht = br.readLine()) != null) { 
                System.out.println("Nachricht:" +  nachricht);
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

Und der Client:

Java:
public class MainActivity extends Activity {

private Socket s;

@Override
protected void onCreate(Bundle savedInstanceState) {  //Wird beim Start der App aufgerufen
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new Thread(new OpenConnection()).start();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {  //Das muss man nicht beachten
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public class OpenConnection implements Runnable {
    public void run() {
        try {
            s = new Socket("letorat.selfhost.bz", 5000);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            writer.write("hello");
            writer.flush();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Wenn ich den Server, und danach die App starte, dann printet der Server erst einmal "Connection". Das heißt ja eigentlich, dass ich eine Verbindung habe. Aber der Server empfängt die Nachricht "Hallo" einfach nicht! Es wird auch keine Exception oder so geworfen... Wenn ich jetzt das Socket (also Client-Side) schließe, oder die Methode shutdownOutput() aufrufe, wird die Nachricht gesendet! Ich will mein Socket aber natürlich für mehr als nur eine Nachricht benutzen... Was macht denn ein shutdownOutput() anders, als ein flush()...?
 
[JAPI]OutputStream#flush()[/JAPI] auf dem Stream von [JAPI]Socket#getOutputStream()[/JAPI] fürs senden aufrufen. Die (Buffered)Writer nehmen das mit dem flush() nicht so genau, das ist zeimlich kacke implementiert.
 
Zuletzt bearbeitet:
Hat leider auch nicht funktioniert... Ich habe auch versucht vor dem flushen noch BufferedWriter.newLine() aufzurufen, hat aber auch nichts gebracht...

Viele Grüße,
mathiasj
 
Nein, ich meinte: Du musst die Daten auch dem OutputStream des Sockets mitgeben. Der BufferedWriter (oder der OutputStreamWriter) behält trotz flush() die Daten für sich, dann werden sie auch nicht gesendet.

Du hast also diese möglichkeiten:
1. Direkt auf den OutputStream schreiben (ergo hast du keine bequemen funktionen wie readLine etc)
2. Die flush()-Methode von OutputStreamWriter und BufferedOutputStream überschreiben, dass sie die Daten tatsächlich sendet.
 
OKay, das mit direkt auf dem OutputStream schreiben, werde ich später mal versuchen... Aber wie könnte ich denn flush() umschreiben? Und warum wurde dieser Bug noch nicht behoben?

LG, mathiasj
 
Nicht umschreiben, überschreiben:

Java:
class MyBufferedWriter extends BufferedWriter
{
    public void flush() throws IOException
    {
        // ...
    }
}
Den Original-Quellcode dazu findest du in der Java-Doku, gidf.
 
Ja, aber das scheint ja dann ziemlich kompliiziert zu werden, die Methode zu überschreiben...

Und auch mit dem normalen OutputStream funktioniert es erst, wenn das Socket geschlossen wird:

Server
Java:
public void run() {
			try {
				char[] msg = new char[100];
				while((is.read(msg)) != -1) { 
					for(int i = 0; i < msg.length; i++) {
						System.out.println(msg[i]);
					}
				}
			} catch(Exception e) {
				e.printStackTrace();
			}
		}

Client:
Java:
public void run() {
			try {
				s = new Socket("letorat.selfhost.bz", 5000);
				OutputStreamWriter out = new OutputStreamWriter(s.getOutputStream());
				out.write("hello\n");
				out.flush();
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
 
Ja, aber das scheint ja dann ziemlich kompliiziert zu werden, die Methode zu überschreiben...

Und auch mit dem normalen OutputStream funktioniert es erst, wenn das Socket geschlossen wird:

Nein. Du benutzt schon wieder einen Writer. Dashier wird mit 100%iger sicherheit klappen:

Java:
// Server
InputStream in = clientSocket.getInputStream();
int k;
while ((k = in.available()) != -1)
    System.out.print((char) in.read());
Java:
// client
Socket serverSocket = new Socket(hostname, port);
OutputStream out = serverSocket.getOutputStream();
out.write("Hello World!".getBytes());

Ausgabe an der Server-Seite:
Code:
Hello World!
 
Zuletzt bearbeitet:
Also, wenn ich das genauso übernehme, passiert gar nichts. Wenn ich ein out.flush() hinzufüge, passiert auch nichts. Füge ich anstatt out.flush() ein socket.close() hinzu, wird mir zwei mal "Hello world" ausgegeben. Außerdem hatte ich in einigen Fällen, die ich jetzt nicht reproduzieren kann plötzlich lauter Fragezeichen, die ausgegebn wurden usw. Wirklich komisch...

Zur Sicherheit nochmal mein jetziger Code:

Java:
public class MainActivity extends Activity {
	
	private Socket s;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		new Thread(new OpenConnection()).start();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	public class OpenConnection implements Runnable {
		public void run() {
			try {
				s = new Socket("letorat.selfhost.bz", 5000);
				OutputStream out = s.getOutputStream();
				out.write("Hello World!".getBytes());
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

und

Java:
public class Server {
	
	public static void main(String[] args) {
		new Server().go();
	}
	
	public void go() {
		try {
			@SuppressWarnings("resource")
			ServerSocket serverSocket = new ServerSocket(5000);
			while(true) {
				Socket clientSocket = serverSocket.accept();
				Thread t = new Thread(new ClientHandler(clientSocket));
				t.start();
				System.out.println("Connection");
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public class ClientHandler implements Runnable {
		private BufferedReader br;
		private Socket socket;
		private InputStream is;
		
		public ClientHandler(Socket clientSocket) {
			try {
				socket = clientSocket;
				is = socket.getInputStream();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		public void run() {
			try {
				int k;
				while ((k = is.available()) != -1)
				    System.out.print((char) is.read());
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

}

Viele Grüße,
mathiasj
 
Das ist allerdings sehr komisch, ja ...

Versuch mal anstadt
Java:
                int k;
                while ((k = is.available()) != -1)
                    System.out.print((char) is.read());
das
Java:
                int k;
                while ((k = is.read()) != -1)
                    System.out.print((char) k);

Also ich habe jetzt gerade diesen Code bei mir getestet und der lief mit [c]k = in.read()[/c] einwandfrei:
Java:
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Tester {
    public static void main(String... args) throws Exception
    {
        new Thread(new Runnable()
        {
            public void run()
            {
                try {
                    ServerSocket ss = new ServerSocket(5600);
                    Socket a = ss.accept();
                    InputStream in = a.getInputStream();
                    int k;
                    while((k = in.read()) != -1)
                        System.out.print((char) k);
                    ss.close();
                }
                catch (Exception ex)
                {
                    System.out.println(ex);
                }           
            }
        }).start();
        // warten, damit das ServerSocket auch offen ist
        Thread.sleep(100);
        Socket s = new Socket("localhost", 5600);
        OutputStream out = s.getOutputStream();
        out.write("Hello World!".getBytes());
        // sicherstellen, dass die JVM den Stream nicht gleich flusht
        Thread.sleep(3000);
        System.out.println("\nFinished");
        System.exit(-1);
    }
}
Und die Ausgabe war wie erwartet:
Code:
Hello World!
Finished
Und das [c]Finished[/c] kam auch 3 Sekunden nach dem [c]Hello World[/c], d.h. [c]flush()[/c] oder [c]close()[/c] haben keinen Einfluss gehabt.

Teste das mal bei dir. Wenn du auf einem deiner beiden Geräte die Ausgabe nicht kriegst, ist etwas mit dem OS falsch (Ist ja anscheinend ne Android-App). Wenn das glatt geht, aber exakt dieser code nicht ziwschen den Geräten funktioniert ist irgendwas mit deiner Internet/LAN-Verbindung futsch.
 
Okay, langsam kommen wir der Sache näher... Das Beispiel funktioniert auf dem localhost, doch sobald ich meine IP Addresse oder meine DynDNS Addresse eingebe, funktioniert das ganze nicht mehr (Da ich bei meinem Android Gerät natürlich nie localhost eingeben konnte, war mir das nicht klar). ABER ich kann ja eine Verbindung zum ServerSocket aufbauen ("Connection" wird geprintet). Die Nachrichten werden aber nicht empfangen (also erst wenn sich das Socket schließt).
Meine Firewall auszuschalten hat nichts gebracht, Port-Forwarding ist auch aktiviert... Gibt es sonst anoch irgendwelche Ideen, woran es liegen könnte, das ich eine Verbindung aufbauen kann, aber keine Nachrichten senden kann?

Vielen Dank schonmal, du hast mir sehr geholfen 🙂

Viele Grüße,
mathiasj
 
Also sehe ich das richtig, du hast diesen code auf Android ausgeführt:

Java:
    import java.io.OutputStream;
    import java.net.Socket;
     
     
    public class Tester {
        public static void main(String... args) throws Exception
        {
            String serverHostname = "...";
            Socket s = new Socket(serverHostname, 5600);
            OutputStream out = s.getOutputStream();
            out.write("Hello World!".getBytes());
            // sicherstellen, dass die JVM den Stream nicht gleich flusht
            Thread.sleep(5000);
            System.out.println("\nFinished");
            System.exit(-1);
        }
    }
Und den auf dem Server
Java:
    import java.io.InputStream;
    import java.net.ServerSocket;
     
    public class Tester {
        public static void main(String... args) throws Exception
        {
                    try {
                        ServerSocket ss = new ServerSocket(5600);
                        Socket a = ss.accept();
                        InputStream in = a.getInputStream();
                        int k;
                        while((k = in.read()) != -1)
                            System.out.print((char) k);
                        ss.close();
                    }
                    catch (Exception ex)
                    {
                        System.out.println(ex);
                    }          
        }
    }

Und da kam absolut keine Ausgabe, bevor das Socket nicht geschlossen war? Wenn ja, dann liegt es höchstwahrscheinlich irgendwie an Android, aber da bin ich dann mit meinem Latein am Ende, sorry :/
 
Ja, dann kommt keine Ausgabe. Aber es kommt auch keine Ausgabe, wenn ich den Code an meinem PC ausführe und anstatt "localhost" mein IP-Addresse eingebe... Wie gesagt, "Connection" wird geprintet aber die Nachricht kann ich einfach nicht senden.

Viele Grüße,
mathiasj
 
Okay, und was ist, wenn du das Android-Gerät auf deinen PC verbinden lässt? Wenn das klappt wäre ich mir ziemlich sicher, dass beim Server irgendwas schief läuft; dass der Code funktionieren sollte ist ja inzwischen eindeutig.
 
Ich glaub hier liegt irgendwie ein leichtes Missverständnis vor:
Ich will den Server auf meinem PC laufen lassen und den Client auf meinem Android Gerät. Wenn ich den Client mit localhost auf dem PC laufen lasse, klappt alles. Auf meinem Gerät kann ich natürlich kein localhost laufen lassen, da er dann nach einem Server auf dem Gerät selbst suchen würde.
Deshalb muss ich bei dem Client die IP meines Rechners eingeben. Egal ob ich den Code mit der IP des Servers auf meinem Rechner oder auf dem Android Gerät laufen lasse, es passiert dasselbe: Der Server zeigt mir an, dass ich eine Verbindung habe, aber ich kann keine Nachrichten austauschen.

Das heißt wenn ich diesen Server starte:

Java:
import java.io.BufferedReader;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	
	public static void main(String[] args) {
		new Server().go();
	}
	
	public void go() {
		try {
			@SuppressWarnings("resource")
			ServerSocket serverSocket = new ServerSocket(5000);
			while(true) {
				Socket clientSocket = serverSocket.accept();
				Thread t = new Thread(new ClientHandler(clientSocket));
				t.start();
				System.out.println("Connection");
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public class ClientHandler implements Runnable {
		private BufferedReader br;
		private Socket socket;
		private InputStream is;
		
		public ClientHandler(Socket clientSocket) {
			try {
				socket = clientSocket;
				is = socket.getInputStream();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		public void run() {
			try {
				int k;
				while ((k = is.read()) != -1)
				    System.out.print((char) k);
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

}

Und dann (egal ob auf Android oder auf der selben Maschine) diesen Code ausführe:

Java:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	
	public static void main(String[] args) {
		new Client().connect();
	}
	
	public void connect() {
		try {
			Thread.sleep(100);
			Socket socket = new Socket("Meine Ip Addresse", 5000);
			OutputStream out = socket.getOutputStream();
			out.write("Hello World!".getBytes());
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Dann zeigt mir der Server Connection an, aber die Nachricht wird erst geschickt, wenn ich das Socket schließe.

Viele Grüße,
mathiasj
 
Achso okey, ich dachte du hättest da einen root-server/cloud-server.

Welche JVM und welches OS hast du? Das ist jetzt das lezte, was mir noch einfällt, woran es liegen könnte
 
Ich benutze Windows 7 Home Premium 64-Bit und die jdk 1.7.0_45 (also auch zum kompilieren). Bei der jdk benutze ich die 32 Bit Version, aber auch die 64 Bit Version zu benutzen hat nichts geändert.
 
Das ist sehhhr strange, ich habe hier das gleiche und kann mit Java zwischen dem PC mit Win7-64bit und dem Laptop Ubuntu-64bit (beide auf JDK 1.7u45) wunderbar alles hin und her senden, was ich mag... ich weiss leider nichtmehr weiter, sorry :/
 
Hmm sehr komisch, da ich ja eigentlich eine Verbindung habe... Ich bemerke grade, dass es auch funktioniert, wenn ich den Stream schließe (also zum Beispiel PrintWriter.close() aufrufe).

Könnte es sein, dass der Router vielleicht irgendwie die Verbindung, aber keine Kommunikation zulässt?

Viele Grüße,
mathiasj
 
Hmm sehr komisch, da ich ja eigentlich eine Verbindung habe... Ich bemerke grade, dass es auch funktioniert, wenn ich den Stream schließe (also zum Beispiel PrintWriter.close() aufrufe).

Könnte es sein, dass der Router vielleicht irgendwie die Verbindung, aber keine Kommunikation zulässt?

Viele Grüße,
mathiasj
Wie gesagt, die Writer nehmen das mit dem flush() und close() nicht so genau.

Dass der Router keine Kommunikation zulässt wäre eigentlich välliger Schwachfug weil die Verbindung dann ja nutzlos ist aber unmöglich ist es nicht.
 
Wird denn wenn du auf deinem Handy

Java:
            s = new Socket("letorat.selfhost.bz", 5000);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            writer.write("hello");
            writer.close();

ausführst, am Server das 'hello' angezeigt?
 
Wird denn wenn du auf deinem Handy

Java:
            s = new Socket("letorat.selfhost.bz", 5000);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            writer.write("hello");
            writer.close();

ausführst, am Server das 'hello' angezeigt?

Ja, wenn ich diesen Code ausführe schon. Schreibe ich aber anstatt close() ein flush(), wird mir das Hallo nicht angezeigt. Auch ein newLine() und dann flush() bringt nichts.

Viele Grüße,
mathiasj
 
Zuletzt bearbeitet:
Lass dir bitte mal am Android-Gerät ausgeben, ob eine Exception geworfen wird.
Das e.printStackTrace() wird da nämlich nichts bringen.
Verwende stattdessen [c]Toast.makeText(getApplicationContext(), e.getClass + ": " + e.getMessage(), Toast.LENGTH_LONG).show();[/c]
 
Nein, es wird keine geworfen (printStackTrace sieht man ja auch im LogCat, aber auch der Toast wird nicht angezeigt). Das Problem besteht ja auch, wenn ich auf meinem PC zu dem Server connecten möchte... Gebe ich localhost ein, klappt alles, gebe ich meine IP ein, muss ich den OutputStream schließen, damit die Daten gesendet werden können. Sehr komisch...

Viele Grüße,
mathiasj
 
Hm...echt seltsam.

Meine letzte mögliche Änderung wäre,
wenn du es mit
Java:
            Socket socket = new Socket();
            socket.connect(InetSocketAddress.createUnresolved("deineIP", 5000), 0);
versuchst.
Vill macht das einen Unterschied.
 
Also egal, ob ich meinen Netzwerk Namen, meine IP Addresse (von wieistmeineip.de), den DynDNS Namen oder localhost verwende... Ich glaube der String wird überhaupt nicht überprüft; es kommt sofort zu der Exception... Sehr mysteriös 🙂

Viele Grüße,
mathiasj
 
Langsam blick ich echt nicht mehr durch... Folgender Code funktioniert nicht (auch auf localhost):

Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	
	public static void main(String[] args) {
		new Server().go();
	}
	
	public void go() {
		try {
			@SuppressWarnings("resource")
			ServerSocket serverSocket = new ServerSocket(5001);
			while(true) {
				Socket clientSocket = serverSocket.accept();
				Thread t = new Thread(new ClientHandler(clientSocket));
				t.start();
				System.out.println("Connection");
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public class ClientHandler implements Runnable {
		private BufferedReader br;
		private Socket socket;
		private PrintWriter pw;
		
		public ClientHandler(Socket clientSocket) {
			try {
				socket = clientSocket;
				br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		
		public void run() {
			try {
				String msg;
				while ((msg = br.readLine()) != null) {
					System.out.println(msg);
				}
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

}

und

Java:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;

public class Client {
	
	public static void main(String[] args) {
		new Client().connect();
	}
	
	public void connect() {
		try {
			Thread.sleep(100);
		    Socket socket = new Socket("localhost", 5001);
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			writer.write("Hi");
			writer.flush();
			JFrame frame = new JFrame();
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setVisible(true);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Vielleicht liegt es auch daran, dass ich jjetzt nicht mehr konzentriert bin, aber was ist da denn los!?

Viele Grüße,
mathiasj
 
Ah ja natürlich, ich hatte vergessen writer.newLine() aufzurufen. Vorher hatte ich mit meiner IP Addresse kurz Probleme, aber da hat sich die Firewall dazwischen geschaltet (hat aber auch nichts zu meinem eigentlichen Porblem geholfen). Kann es evtl. sein, dass sich die Router Firewall zwischen die Nachrichten stellt? Aber dann würde sie ja keine Verbindung zulassen...
Es muss ja eigentlich irgendwie an meinen Verbindungseinstellungen liegen, da der Code ja mit dem localhost funktioniert... Aber was blockt nicht die Verbindung, aber die Nachrichten? (Bis der Stream geschlosesen wird)

Viele Grüße,
mathiasj
 
Einen ähnlichen Fehler hatte ich mal auf meinem Raspi.
Es wurden die Daten erst gesendet, als die JVM terminierte.

Schau mal, ob die Daten nach dem [c]socket.close()[/c] sofort gesendet werden, auch wenn
der Thread noch läuft.
Mach hierzu ein [c]Thread.sleep(5000)[/c] nach dem [c]close()[/c] rein und schau, ob die Daten
erst nach den 5 sec gesendet werden.
 
Könnte es vielleicht irgendwie am NAT Loopback oder so liegen? Es muss ja etwas mit dem Router zu tun haben, da localhost ja funktioniert... Ich habe den W921v von der Telekom. Vielleicht hilft das ja weiter. Aber ich habe es schonmal geschafft einen Server auf diesem Router zu kontaktieren...

Viele Grüße,
mathiasj
 
Einfach XAMPP runterladen und anwerfen, Port-Forwarding einrichten und schauen ob du die Xampp-Seite von aussen erreichst.
 
Was soll ich denn mit XAMPP machen? Ich kenn mich damit nicht wirklich aus... Also javaw.exe wird mir als neues Socket angezeigt, wenn ich den Client starte.

Viele Grüße,
mathiasj
 
XAMPP ist ein Entwicklungs-Webserver; da ist Apache 2, MySQL 5, PHP 5, Pearl etc drin. Wenn du's installiert hast einfach xampp_start.exe ausführen, Port 80 und 443 freigeben und im Webbrowser deine DynDNS eingeben.
 
Also beim Ausführen der xampp_start.exe bekomme ich eine Fehlermeldung (Bild im Anhang).
Muss ich bei der Eingabe der DynDNS Addresse eigentlich ein Protokoll angeben?

Ach ja, das Porgramm funktioniert, wenn ich die Netzwerk IP des Rechners angebe.

Viele Grüße,
mathiasj
 

Anhänge

  • xampp.png
    xampp.png
    32,7 KB · Aufrufe: 19
Das liegt daran, dass ein anderes Programm deinen Port 80 schon benutzt, das ist meistens Skype (lässt sich in den Einstellungen abschalten).

Nein, das Protokoll ist HTTP, das macht der Browser automatisch.
 
Ah ja, Skype hat den Fehler verursacht. Aber ich bekomme dann keine Verbindung mit der DynDNS Addresse. Ich habe es aber schon richtig verstanden, dass ich Port 80 und 443 auf meinen PC forwarden muss?

Viele Grüße,
mathiasj
 
Ja, das hast du.

Also, wenn XAMPP läuft, du per 127.0.0.1/localhost/Lokaler IP die XAMPP-Seite siehst (http://localhost/xampp/) aber mit port-forwarding mit deiner Öffentlichen IP / deiner DynDNS keine Verbindung bekommst, liegt das Problem 100% beim Router.
 
Wahrscheinlich kann ich dann in dem Netzwerk nur meine interne IP benutzen, denn ich habe es gerade mit einem Freund von außen geteset; dabei hat alles wunderbar geklappt.
Kann man den irgendwie einstellen, dass sich die interne IP, die dem Rechner gegeben wird sich nicht mehr ändert?

Viele Grüße,
mathiasj
 
Kommt auf den Router an. Auf meiner FritzBox kann man einstellen, welche IP welches Gerät bekommt. Innerhalb eines netzwerks kannst du deinen PC aber auch per Computername ansprechen also z.B. http://meinPC/
 
Also das mit dem Computernamen funktioniert irgendwie nicht... Weder auf dem Android Gerät noch auf dem PC selbst. Ich gebe dann ein new Socket("http://Mathias-Server", 5001) und bekomme ein UnknownHostException.

Viele Grüße,
mathiasj
 

Zurück
Oben