Socket Online Highscore. Vorgehensweise

Errschaffer

Mitglied
Guten Morgen,

da der einfache Weg über MySQL leider nicht funktioniert hat muss ich meinen Online Highscore irgendwie anders realisieren. Problem ist das ich neu auf dem Gebiet der Netzwerkprogrammierung bin.

Mir wurde dann geraten die Daten von meinem Programm aus an ein PHP Script zu senden welches es dann weiter verarbeitet. Gut PHP kann ich das ist schonmal gut :D. Aber ich wüsste jetzt nicht wie ich anfangen soll. Ich weiss das Sockets so eine Art Kanal ist wo rüber der Datenverkehr läuft. Einen zu öffen bekomme ich auch noch hin aber mir fehlen die Schlagwörter nach denen ich suchen muss.

Kann mir jemand ein paar Schlagwörter nennen oder gibt es vieleicht sogar irgendwo ein paar Beispiele in ähnlicher Form?
 
Zuletzt bearbeitet:
M

Marcinek

Gast
Hallo,

der korrekte Weg das zu machen ist über Webservices.

Du stellst auf deinem Server mittels PHP einen entsprechenden Webservice bereit und deine Java Anwendung greift darauf zu.

Dann musst du nix mit protokollen machen, sondern tauschst xml dateien aus.

Gruß,

Martin
 

Chéfkóch

Mitglied
Ich würde dir auch zu einem Webservice raten.
Trotzdem solltest du dir mal Gedanken machen wie DU es dir vorstellst.
Es gibt viele Möglichkeiten Dateien zu übertragen:
- Highscore in ne Datei schreiben und uploaden
- Webservice
- per POST
.....
 

Errschaffer

Mitglied
Och mir ist das mittlerweile egal. Ich suche schon seit Wochen nach einer Möglichkeit. Jetzt habe ich endlich einen Free Hoster gefunden der sowas erlaubt und eine scheinbar einfache Möglichkeit dieses auch zu nutzen. So groß ist das Spiel auch wieder nicht das ich dafür jetzt die besonders gute technische Variante für das setzen eines Highscores brauche. Wichtig ist nur das eine Zahl und ein Nickname (also der Highscore) in meine MySQL Datenbank kommen und das müsste ja mit Webservices gehen.Und ich will endlich fertig werden und mich meinem Traumprojekt widem da ich endlich genug C++ Erfahrung habe :).

Also einen PHP Webservice habe ich jetzt erstellt. Scheint auch zu funktionieren. Ich hab die WSDL mal durch einen Validator laufen lassen und es kamen zumindestens keine Fehler. Dann hab ich natürlich gesucht wie ich dafür einen Java Client schreibe. Ich bin da auf JavaX WS gestoßen und mehrere Aussagen das es sehr einfach sein soll. Allerdings auf keine Anleitung wie ich das jetzt Schritt für Schritt mache. Sätze wie "Ja also da bindest du die WSDL Datei ein dann erstellste ein Objekt und da haste es" aber zu hauf. Zu "PHP Client zu Java Webservice" gab es einige Links aber ich wills ja umgekehrt :)


Über einen empfehlenswerten Link würde ich mich freuen :applaus:
 
Zuletzt bearbeitet:

Errschaffer

Mitglied
Danke erstmal. Das hat mir schon mal sehr viel weiter geholfen

Aber meine WSDL - Datei scheint doch fehlerhaft zu sein. Es gab beim ersten Parsen viel mehr Fehler die ich selber lösen konnte. Ein Fehler bleibt noch. Ich denke mal das bezieht sich ebenfalls auf diesen Block.

[XML]
<wsdl:service name='addService'>
<wsdl:port name='addPort' binding name='addBinding'>
<soap:address location='http://temp.errschaffer.square7.ch/server.php'/>
</wsdl:port>
</wsdl:service>
</definitions>[/XML]

Die anderen Fehler habe ich dadurch behoben , indem ich einige Tags mit "wsdl:" ergänzt habe.

Aktueller Fehler: missing required attribute binding of element wsdl:port

In welcher Zeile das liegt kann ich mir ja denken aber ich wüsste jetzt nicht wie ich das korrigieren kann.

:bahnhof:
 

Errschaffer

Mitglied
Puhh das waren noch einige Fehler die ich eben beheben musste außer dieses binding. War wohl sehr veraltet dieses Tutorial.

Ich bin kurz vor dem Durchbruch :toll:
Wsimport versucht schon mal den Code zu generieren, was er ja vorher nicht getan hat.
Allerdings kommt jetzt die Meldung:
server.php non existent directory

Also für mich bedeutet das , dass er das Verzeichnis nicht findet wo server.php liegt. Oder sehe ich das falsch?
 

kay73

Bekanntes Mitglied
SOAP und Webservices im Allgemeinen sind prima Sachen...für Geschäftsanwendungen. In Deinem Falle eindeutig ein Schuss mit Kanonen auf Spatzen.

Das eigentliche "Hochladen" kannst Du ganz einfach mit der bloßen HTTP-Request-Zeile erledigen. Das reicht doch völlig aus:

Code:
http://localhost/highscore.php?p=Super+Master&hs=42000&hash=9023ad13d8add5da22665225cdbb0de8

Mach Dir lieber Gedanken darum, dass nicht irgendein Spassvogel einfach den Request/POST mitsnifft und Deinen Highscore-Server mit Miiliarden-HighScores und Schimpfwörtern als Spielernamen flutet. Führe dazu wenigstens ein sharedSecret ein.

Quick-and-SuperDirty Java
Java:
package demo.highscore;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class App {
	private static final String SHARED_SECRET="strenggeheim"; 
	
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
		
		final long myHighScore = 42000L;
		final String playerName = "Super Master";
	
		sendHighscoreSafe(playerName, myHighScore);
	}

	private static String makeSignature (final String playerName, final long highScore) throws NoSuchAlgorithmException {
		
		final byte [] d = MessageDigest.getInstance("MD5").digest((playerName+highScore+SHARED_SECRET).getBytes());
		
		return String.format("%1$02x%2$02x%3$02x%4$02x%5$02x%6$02x%7$02x%8$02x%9$02x%10$02x%11$02x%12$02x%13$02x%14$02x%15$02x%16$02x",
				d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]);
	} 
	
	private static void sendHighscoreSafe(final String playername, final long highcore) throws NoSuchAlgorithmException, IOException {

		final String request = "http://localhost/highscore.php?p="+URLEncoder.encode(playername,"UTF-8")+"&hs="+highcore+"&hash="+makeSignature(playername, highcore);
		final URLConnection conn = new URL(request).openConnection();
		
		int n;
		final InputStream is = conn.getInputStream();
		final byte [] buffer = new byte [512];
		final ByteArrayOutputStream bos = new ByteArrayOutputStream();
		
		while(-1 != (n = is.read(buffer, 0, buffer.length))) {
			bos.write(buffer, 0, n);
		}
		
		final String response = new String(bos.toByteArray()).trim(); 
		if(!response.equalsIgnoreCase("ok")) {
			throw new IllegalStateException("Bad response from server:"+response);
		}
	}	
}
Quick and SuperDirty
Code:
highscore.php
Code:
<?php 
	define('SHARED_SECRET', "strenggeheim");

	$playername="";
	if(isset($_GET['p'])&& !empty($_GET['p'])) {
		$playername = trim($_GET['p']);
	} else { 
		exit; 
	}

	$highscore=0;
	if(isset($_GET['hs'])&& !empty($_GET['hs'])) {
		$highscore = intval(trim($_GET['hs']));
	} else { 
		exit; 
	}

	$hash="";
	if(isset($_GET['hash'])&& !empty($_GET['hash'])) {
		$hash = trim($_GET['hash']);
	} else { 
		exit; 
	}	
	
	if(!md5($playername.$highscore.SHARED_SECRET) === $hash) {
		exit;
	}

	// process highscore here
?>
ok

Und das reicht bei weitem nicht, denn der Java-Code auf dem Client lässt sich mit OpenSource-Tools auf simple Weise dekompilieren, neuübersetzen und für gefälschte HTTP-Requests missbrauchen. Das eigentliche Problem liegt IMHO in der sicheren Übertragung des HighScores und lässt sich nicht erschöpfend lösen.
 
Zuletzt bearbeitet:

Errschaffer

Mitglied
Ich bin schon längst auf einen HTTP Request umgestiegen, habs nur vergessen zu sagen :oops:

Danke für den Tipp mit der sicheren Übertragung ich werde das umsetzen und mich weiter darüber informieren :)
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben