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
TCPClient.java
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.
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: