Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht

JavaMeetsBlueJ

Bekanntes Mitglied
Hallo liebes Forum, ich habe gerade mal mit meinem Buch was kleine geschrieben. Lokal läuft das auch alles, bloß über das Internet gehts nicht. Kann mir jemand sagen, wo der Fehler liegt? Die übergebene IP-Adresse beim Socket des Client habe ich einfach aus dem buch übernommen, aber da muss die eigene hin, nur wie komm ich an die?Ist das überhaupt der Fehler? Falls nicht wo dann?

Projekt Client

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JFrame;


public class Client {

	private int port = 4XXX;
	String ergebnis;
	String aufgabe;
	Gui fenster;
	
	public Client(Gui fenster)
	{
		this.fenster = fenster;
	}
		public void abgehts()
	{
		try(Socket socket = new Socket("127.0.0.1", port);  //-------------------- Problem hier?----------------------
		 OutputStream streamOut = socket.getOutputStream();
			InputStream streamIn = socket.getInputStream();
				PrintWriter writer = new PrintWriter(streamOut,true);
				
				InputStreamReader streamReaderIn = new InputStreamReader(streamIn);
				BufferedReader reader = new BufferedReader(streamReaderIn);)
		 {
		 aufgabe = "add 40 2";
			writer.println(aufgabe);
		 ergebnis = reader.readLine();
			talkToGui();
		 }
		catch(IOException ex)
		{
			fenster.setTextException(ex);
		}
		
	}
		public void talkToGui()
		{
			fenster.setText(aufgabe, ergebnis);
			
		}
		
		public static void main(String[] args)
		{
			Gui gui = new Gui();
			gui.fenster.setVisible(true);
		}
		
		
	

}

Projekt Server
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {

	private int port = 4XXX;
	
	
	public void abgehts(){
		
		try(
				ServerSocket serversocket = new ServerSocket(port);
				Socket socket = serversocket.accept();
				
				InputStream streamIn = socket.getInputStream();
				InputStreamReader streamReaderIn = new InputStreamReader(streamIn);
				BufferedReader reader = new BufferedReader(streamReaderIn);
				
				OutputStream streamOut = socket.getOutputStream();
				PrintWriter writer = new PrintWriter(streamOut, true);
				)
		
		{
			String anfrage = reader.readLine();
			String[] tokens = anfrage.split(" ");
			
			int x = Integer.parseInt(tokens[1]);
			int y = Integer.parseInt(tokens[2]);
			
			int ergebnis = 0;
			if(tokens[0].equalsIgnoreCase("add"))
			{
				ergebnis = x + y;
			}else if
			(tokens[0].equals("diff"))
			{
				ergebnis = x - y;
			}
			
			String antwort = String.valueOf(ergebnis);
			writer.println(antwort);
			
			socket.close();
			serversocket.close();
		}
		catch(IOException ex){
			System.out.println(ex);
		}
	}
	
public static void main(String[] args) {
		
		Gui gui = new Gui();
		gui.fenster.setVisible(true);

	}

}

Gruß
 
Ich denke nicht, dass es über das Internet so einfach ist, da du keine statische IP hast. Dein Router bekommt von deinem ISP immer wieder eine neue IP zugewiesen. Für den Server bräuchte man allerdings eine statische IP, die gleich bleibt.

[EDIT]Mithilfe von DynDNS kann man sich eine "Art" statische IP verschaffen. Es gibt verschiedene Plattformen, die diesen Dienst anbieten. Einfach mal googeln. Ob man damit allerdings arbeiten kann was Java angeht, weiß ich nicht.
[/EDIT]
Die Funktionsweise ist denke ich eher uninteressant und deshalb lasse ich das mal weg. 🙂

Alternativ könntest du deine Client-Server Anwendung innerhalb deines Netzwerkes testen, sofern dort mehrere PC's vorhanden sind.

Wenn du nur "nslookup" in die Windows Eingabeaufforderung eingibst, solltest du meines Wissens deine IP vom Router bekommen, die dieser momentan hat.
 
Zuletzt bearbeitet:
Ich denke im Netzwerk sollte es klappen, nur mein Bestreben ist es, das ganze wirklich mal später im gößeren Format über das Word Wide Web laufen zu lassen. Was für Möglichkeiten gibt es da? Ich bin nämlich auch ohne jegliche Erfahrung, wiel ich mir den ganzen Kram auf freiwilliger Basis autodidaktisch bebringe 😉

Gruß
 
Für den des Server hinter einem DSL Router und einem CLient der sich über's Internet mit dem Server verbinden will brauchst du folgendes:

a) Die IP des Routers auf der WAN Seite.
b) Ein eingerichtetes Portforwarding im DSL-Router für deinen Server-Port.

Zu a)

Deine offizielle IP erfährst du, wenn du z.b. eine Seite wie What's My IP Address? Networking Tools & More besuchst. Die zeigt dir die aktuelle IP an.

Damit du nicht immer nach deiner aktuellen IP schauen musst (die wechselt i.d.R. bei einem DSL-Anschluss nach 24h, kann aber u.U. auch länger halten), kannst du einen dynamischen DNS Dienst wie DynDNS (Managed DNS | Email Delivery | SMTP | Domain Registration) benutzen. Damit hast du einen festen Hostnamen, welcher immer auf deine aktuelle IP zeigt.

Zu b)

Die Daten welche beim Router eingehen, wissen erstmal nur: Ich will zu diesem Router auf Port XYZ. Aber der eigentliche Server steht ja hinter dem Router im lokalen Netz. Mittels POrtforwarding kannst du deinem Router beibringen: "Alles was von aussen kommt und bei mir auf Port XYZ eingeht, muss ich nach intern an die IP 1.2.3.4 und Port XYZ weiterleiten". Details dazu findest du im Netz oder im Handbuch deines Routers.

Gruß
Alex
 
Kleiner Tipp noch: Falls du BlueJ als IDE deiner Wahl nutzen solltest und darin auch Anwendungen laufen lässt: Nimm was anderes 🙂
 
BlueJ benutze ich allerhöchstens noch, um die Beispiele meiner Buch-DVD anzusehen. Ich glaube ich benutze jetzt schon seit einem halben Jahr oder so Eclipse. Keine Sorge 😉

Gruß
 
Für die Verbindung übers Internet verwende ich einfach Tunngle. Ihr geht in den selben Raum und connectet auf die IP, von dem, der den Server zu laufen hat.
 

Zurück
Oben