Verbindungsproblem über das Internet

Status
Nicht offen für weitere Antworten.

House

Mitglied
Mein Ziel
Ich selbst habe noch nie eine Anwendung mit Netzwerkkommunikation geschrieben. Jedoch haben wir uns damals mal ganz kurz in einer Rechnernetzevorlesung angesehen wie einfach die ersten Schritte per Java sind. Vor langer Zeit habe ich mal ein kleines Tic Tac Toe Spiel mit Java programmiert und würde gerne dem Spiel eine Internetfunktionalität hinzufügen, so dass eben zwei Spieler von Zuhause aus gegeneinander spielen können.

Mein Problem
Die ersten Schritte der Netzwerkprogrammierung haben wir uns damals nur im Rahmen eines kleinen, privaten Netzwerkes angesehen. Innerhalb dieses Netzwerkes konnte man ohne Probleme eine Verbindung zwischen den zwei Programmen aufbauen und eben eine Nachricht übermitteln. Jedoch war es nicht möglich die gleichen zwei Programme für eine Kommunikation über das Internet zu benutzen. Soweit mir bekannt (ich kann mich aber täuschen, ich bin kein Netzwerk- / Internetspezialist) hat das entweder mit dem NAT System oder einem aktuell nicht benutzbaren Port zu tun.

Meine Fragen
Mich persönlich würde jetzt interessieren was genau das Problem ist, so dass das Programm nur innerhalb eines privaten Netzwerkes funktioniert und nicht mehr über das Internet? Zudem würde ich gerne erfahren, wie man Anwendungen schreiben kann, welche auch über das Internet kommunizieren können. Was muss man da konkret anders machen oder was ist bei dem bisherigen Programm falsch / problematisch? Mein Ziel ist es, wie schon erwähnt, letztendlich eben einem Tic Tac Toe Spiel eine Internetfunktionalität hinzu zu fügen.






TCPServer.java
Java:
import java.io.*; 
import java.net.*; 

class TCPServer { 

  public static void main(String argv[]) throws Exception 
    { 
	  /**
	   * Der Client wird eine Zeichenkette senden, die in dieser Variable
	   * zwischengepeichert wird.
	   */
      String clientSentence; 
      
      /**
       * Die bearbeitete Zeichenkette wird in dieser Variable abgelegt.
       */
      String capitalizedSentence; 

      /*
       * Hier wird die Verbindung bereitgestellt. Der Server wird am Port 6789 auf
       * eingehende Daten lauschen.
       */
      ServerSocket welcomeSocket = new ServerSocket(6789); 
      
      // Meldung an den Benutzer, dass der Server ordnungsgemaess gestartet ist.
      System.out.println("Server gestartet. Erwarte eingehende Daten auf Port 6789.");
  
      // alter Programmierertrick: fuehre eine Endlosschleife aus, bis das Programm von
      // aussen her abgebrochen wird...
      while(true) { 
    	  
    	  // Die Verbindung wird geoeffnet und wartet auf Anfragen.
          Socket connectionSocket = welcomeSocket.accept(); 

          /**
           * Vom Client wird ueber den <InputStream> ein Datenstrom eingelesen.
           */
          BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
          
          /**
           * Zur Ruecksendung wird ein Datenstrom <OutputStream> bereitgestellt.
           */
          DataOutputStream  outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 

          // Die Zeichenkette wird empfangen.
          clientSentence = inFromClient.readLine(); 
          // ... bearbeitet ...
          capitalizedSentence = clientSentence.toUpperCase() + '\n'; 
          // und zurueck geliefert.
          outToClient.writeBytes(capitalizedSentence); 
        } 
    } 
}

TCPClient.java
Java:
import java.io.*; 
import java.net.*; 

class TCPClient { 

    public static void main(String argv[]) throws Exception 
    { 
    	/**
    	 * Wurde beim Start ein Servername uebergeben, so wird dieser verwendet,
    	 * ansonsten wird der Name des Servers auf "localhost" gesetzt.
    	 */
        String serverName = (argv.length > 0) ? argv[0] : "localhost";
        
        /**
         * Auf der Clientseite wird eine Zeichenkette eingegeben, die an den Server
         * gesendet werden soll.
         */
    	String sentence = "empty"; 
    	
    	/**
    	 * Der Server sendet eine modifizierte Zeichenkette zurueck.
    	 */
        String modifiedSentence; 

        
        /**
         * Ueber diesen Datenstrom wird von der Standardeingabe (System.in) eine
         * Nutzereingabe eingelesen.
         */
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        
        /**
         * An dieser Stelle wird der eigentliche Socket (Steckdose) bereitgestellt.
         * Sie stellt eine Verbindung her, die den Server <serverName> ueber den Port 6789
         * anspricht.
         */
        Socket clientSocket = new Socket(serverName, 6789);
        
        /**
         * Es wird ein Datenstrom definiert, der ueber den OutputStream des geoeffneten
         * Sockets <clientSocket> die Daten zum Server transportiert.
         */
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        
        /**
         * Vom Server wird als Antwort ebenfalls ein Datenstrom erwartet, der ueber den
         * InputStream des clients empfangen werden soll. 
         * 
         */
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

        
        System.out.println("Geben Sie eine beliebige Zeichenkette ein!");
        // Nutzereingabe lesen
       	sentence = inFromUser.readLine(); 
	if (sentence.length() < 1)
		sentence = "leere Zeichenkette";        

        System.out.println("Wird an den Server: "+serverName+" gesendet, der sie bearbeitet.\n");
        // Eingegebenen Satz an den Server uebermitteln.
        outToServer.writeBytes(sentence + '\n'); 

        // Empfangene Antwort vom Server uebernehmen und ausgeben 
        modifiedSentence = inFromServer.readLine(); 
        System.out.println("SERVERANTWORT: " + modifiedSentence); 

        // Schliessen der geoeffneten Verbindung
        clientSocket.close(); 
                   
    } 
}



Ich würde mich über Hilfe sehr freuen und bedanke mich für das Lesen des Beitrags. Ich habe auch kurz geschaut ob es schon ähnliche Themen in diesem Forum gab, aber ich habe auf die Schnelle nichts gefunden.
 
Zuletzt bearbeitet:

Geeeee

Bekanntes Mitglied
Ohne mich jetzt mit dem Programmcode als solches en detail zu beschäftigen: Als erstes musst du eben am Router oder in der Firewall, die vor dem Rechner ist, der den TCPServer erstellt den Port freigeben, dann klappts auch mit dem Internet. Lokal sollte das ohne Probleme gehen, wenn man sich an die 127.0.0.1 hält.
 

House

Mitglied
Danke für die Antworten und erste Hilfen. :)



Als erstes musst du eben am Router oder in der Firewall, die vor dem Rechner ist, der den TCPServer erstellt den Port freigeben, dann klappts auch mit dem Internet.

Ich habe das richtig verstanden: Nur der Rechner auf dem TCPServer läuft muss - zumindest in dem Fall - den Port 6789 freigeben? Der Rechner auf dem TCPClient läuft und die Daten dann zu TCPServer schickt, der muss den Port nicht freigeben?

Lokal sollte das ohne Probleme gehen, wenn man sich an die 127.0.0.1 hält.

Da geht es ohne Probleme und im privaten Netzwerk geht es auch ohne Probleme. Eben nur über das Internet nicht.



Warum ist es dann eigentlich nicht üblich für andere Anwendungen a la ICQ einen Port freizugeben? Werden hier wohl registrierte oder "well-known" Ports benutzt, welche dann grundsätzlich nutzbar sind?
 
T

tuxedo

Gast
Jepp, nur der Server braucht die Portfreigabe.

Und das ist auch der Grund warum du das für ICQ nicht brauchst: Du bist nur Client, nicht Server.

Beim Dateitransfer müsste ich raten: UDP mit UDP-Whole-Punching vielleicht? Oder alternativ via vermittelnden Server ...Oder eben, falls es der Router unterstützt: UPNP

- Alex
 

House

Mitglied
Jepp, nur der Server braucht die Portfreigabe.

Und das ist auch der Grund warum du das für ICQ nicht brauchst: Du bist nur Client, nicht Server.

Danke für die Information. Ist natürlich logisch.

Beim Dateitransfer müsste ich raten: UDP mit UDP-Whole-Punching vielleicht? Oder alternativ via vermittelnden Server ...Oder eben, falls es der Router unterstützt: UPNP

- Alex

UDP sagt mir natürlich was. Aber der Rest nicht. Gibt es eine Internetseite wo man evtl. mehr über all das erfährt? Wobei mir die aktuellen Informationen schon reichen, damit bin ich schon sehr zufrieden.



Habe die zwei Programme jetzt auch über das Internet erfolgreich kommunizieren lassen. Danke noch einmal. :)
 
T

tuxedo

Gast
Oha. Ja, ein Tippfehler :oops: Kommt vor. Aber google liefert ja dennoch das richtige Ergebnis :)

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Netzwerk Verbindungsproblem mit Cajo Netzwerkprogrammierung 5
A Socket UDP Chat Verbindungsproblem im WWW (Server sendet ins leere) Netzwerkprogrammierung 11
S Verbindungsproblem Netzwerkprogrammierung 5
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2
E Zwei PCs über das Internet miteinander verbinden? Netzwerkprogrammierung 3
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
E Java über Socket ins Internet? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
M Socket JavaProg über einen Clienten steuern Netzwerkprogrammierung 5
M Mail über Exchange versenden Netzwerkprogrammierung 13
F C/S über HTTPS Netzwerkprogrammierung 2
D ...class.getResourceAsStream("/meine.properties") funktioniert nicht über RMI? Netzwerkprogrammierung 3
M ganymed-ssh2.har: ftp-Verbindung über ftp-Proxy Netzwerkprogrammierung 2
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
Z File über Socket lesen Netzwerkprogrammierung 3
A HTTP Binärdaten über PHP-Skript in Datenbank schreiben bzw auslesen Netzwerkprogrammierung 2
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P FTP isFile() über FTP Netzwerkprogrammierung 3
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
A UCP Connection über Proxy möglich? Netzwerkprogrammierung 7
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
F Char über Netzwerk senden Netzwerkprogrammierung 6
S HTTP Login mit CAS Authentisierung über SSL Netzwerkprogrammierung 2
C Befehle über ein GUI an Server senden Netzwerkprogrammierung 15
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
I Objekte über das Netzwerk Netzwerkprogrammierung 5
M Google Translate über Java ansprechen? Netzwerkprogrammierung 13
F Socket ImageIcon über Socket --> Fehler Netzwerkprogrammierung 14
N Datenaustausch zwischen Java-GUI und PHP-Programm über SOAP Netzwerkprogrammierung 19
L RMI Informationen über die Clients herausfinden Netzwerkprogrammierung 5
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben