Netzwerk - Programmierung

thatIsAFeature

Grünschnabel
Hallo.
Ich habe mit dem Thema noch keine Erfahrung.
Ich möchte eine Spiel schreiben mit welchem man über das Internet mit einer anderen Person Schach spielen kann. Ich benötige nur einen Hinweis in die richtige Richtung mit welchen Verfahren eine solche Netzwerkverbindung ohne einen vermittelten Server aufgebaut werden kann. Dies funktioniert aber wahrscheinlich nur wenn einer der Spieler die IP des anderen kennt. Oder nicht Aber wie funktioniert es dann wenn sich die Spieler in einem Netzwerk befinden, also im Netzwerk eine IP haben und eine nach draußen
 

hammet

himekishi
Also wenn die Spieler sich in einem LAN befinden, wird die LAN-IP für die Kommunikation benutzt. Im internet die IP, die durch die Einwahl deines Providers entsteht. (zudem ist das Internet auch ein Netzwerk). Deswegen gibt es in den meisten Multiplayerspielen einen LAN- und einen Internet-Modus (so kann man das am besten trennen).
Zudem wird eine Kommunikation ohne Server schwer. Wenn 2 Schachspieler kommunizieren wollen, muss ein Spieler auf den anderen "warten" und damit bildet der wartende Spieler den Server und der 2. Spieler wählt dieses Server an.
Eine Kommunikation ohne Server ist nur sehr schwer zu realisieren (falls überhaupt sinnvoll ? ).
 

takidoso

Erfahrenes Mitglied
Ich habe mal vor ein paar Jahren ein schach für 4 Leute gebaut gehabt.
Ich habe es mir da "einfach" gemacht, indem man einen der Rechner als Host definiert hat, dessen IP man an die anderen Spieler auf einen anderen unabhängigen Weg kommuniziert hat(z.B. Telefon, mail, chat) . Wahlweise ging das auch über eine Symbolische Adresse mittels eines sogenannten dynamischen Links.
Für einen dynamschen Link gibt es Provider, z.B. dyndns.

Eine andere sicher viel nettere Variante wäre die Technologie JXTA zu verwenden. Diese hat den Vorteil, dass Rechner hinter Firewalls und Routern auch erreicht wreden können, was mit meinem Programm damals nicht ging.

Leider habe ich in Sachen JXTA keine umfassenden Tutorials bisher finden können, nur die ein oder anderen kleinen Beispiel-Codefragmente. Aber vielleicht wirst Du ja besser fündig als ich.
 
Zuletzt bearbeitet:

Andibert

Mitglied
Das einfachste ist eine Socketverbindung.

Dazu muss einer Der Spieler das Spiel hosten.
In deinem Programm müsstest du dann einen Serversocket anlegen (mit einer Serverportnummer) Diese Portnummer muss auf dem "Server" erreichbar sein. Also Firewall muss den Port durchlassen und ein eventuell vorhandener Router müsste ihn weiterleiten (nur WAN).

Code:
public boolean hosten()
	{
		// Versuche neuen Serversocket mit der Portnummer GAME_PORT zu erstelen.
		try
		{
			server = new ServerSocket(GAME_PORT);
		}
		catch (IOException e)
		{
			return false;
		}
...

Fragt der Client am server nach, und wird akzeptiert, bekommst du eine Socketverbindung auf der prinzipiell beide Seiten gleichwertig sind. da auch hin und her geschossen wird, brauchst du dich zu diesem Zeitpunkt in der Regel um Ports nicht mehr zu kümmern.
Von der Socketverbindung kannst du dir dann die in und out Streams holen...
Code:
...
          try{
			// ...mit dem ersten akzeptierten Client eine Verbindung
			// einzugehen...
			verbindung = server.accept();
			// ...In- und Outputstreams zu setzen...
			in = verbindung.getInputStream();
			out = verbindung.getOutputStream();
			// ...und den ServerSocket zu schliessen
			server.close();
		}
		catch (IOException e)
		{
			return false;
		}
		return true;
	}

Code:
public boolean beitreten(String hostIP)
	{
		// Versuche...
		try
		{
			// ...eine Verbindung mit dem Host herzustellen...
			verbindung = new Socket(hostIP, GAME_PORT);
			// ... und In- und Outputstreams zu setzen.
			in = verbindung.getInputStream();
			out = verbindung.getOutputStream();
		}
		catch (IOException e)
		{
			return false;
		}
		return true;
	}

und einen Objectstream draufsetzten.

Durch den kannst du dann (selbstgeschriebene) Objekte schicken.
Das Lesen der Objekte aus dem Stream musst du in einem eigenen Thread machen, da es den Thread aus dem es aufgerufen wird so lange Pausiert bis es ein Objekt bekommt. Machst du also objectInputStream.readObject() irgentwo im Event Dispatching Tread blockiert dir das die Komplette GUI.

Mfg Andibert

P.S. Megamobbing nutzt eine solche Verbindung zum Beispiel:
http://gewalt.biz/deutsch/site/projekte/megamobbing.html
 
Zuletzt bearbeitet:

thatIsAFeature

Grünschnabel
danke für die super Beschreibung.
Bin zur Zeit noch mit der GUI beschäftigt, deswegen habe ich das noch nicht ausprobiert. Habe aber genau so etwas gesucht!