Jump to content
Unity Insider Forum

V-Server Connection


Kerugal

Recommended Posts

Hallo zusammen,
ich stehe auf dem Schlauch, was auch der Grund für meinen Post ist.
Ich habe bereits einige fertige Spielchen gemacht, nun aber wollte ich mich mal an die Programmierung
einer Highscore machen, welche natürlich über einen Server laufen soll.

Getan wie gesagt, einen günstigen Linux V-Server gemietet, MySql, Phpmyadmin draufgehauen und
versucht mit einem Simplen Codeschnippsel die Connectivität zu testen.

 

using System;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace Test
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			System.Console.WriteLine(checkDB_Conn());
			System.Console.ReadKey();
		}
		public static bool checkDB_Conn()
		{
			MySql.Data.MySqlClient.MySqlConnection conn;
			string myConnectionString;
			bool check = false;
			myConnectionString = "server=81.169.***.***;uid=root;" +
				"pwd=******;database=test;";

			try
			{
				conn = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString);
				conn.Open();
				check = true;
			}
			catch (MySql.Data.MySqlClient.MySqlException ex)
			{
				check = false;
			}
			return check;
		}
	}
}

Da ich das in XAMPP schon x-mal gemacht habe, dachte ich mir, statt localhost die IP Adresse und das ding läuft...

Ich wäre wirklich sehr dankbar, wenn irgendjemand, mir meinen Fehler aufzeigen könnte.
-ist der connectionString falsch?
-phpmyadmin liegt auf /var/www/phpmyadmin , ist das korrekt?

Vielen dank im Voraus!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Liegt der Code auf dem Server? Wenn nein, ist da schonmal der Fehler. Man sollte niemals direkt von irgendwo eine Datenbankverbindung aufbauen. Stattdessen immer eine Schicht dazwischen packen. Darf mit einem kleinen php-Skript losgehen, das dafür sorgt, dass nur gültige Abfragen durchkommen. Auch wenn sich das Konnektivitätsproblem vielleicht lösen lässt, holst du dir mit einer direkten Verbindung vom Ccient zur Online-Datenbank nur Probleme ins Haus.

Sobald du auf HTTP-Anfragen an deine Web-API umgestellt hast, werden sich die Probleme von alleine lösen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Sascha,
erstmal vielen Dank für die schnelle Antwort.

Das Registrations und Login Script werde ich in PHP schreiben, sobald ich weiß wie ich auf ein PHP Scipt von C# zugreifen kann :P
Ich wollte eigentlich nur Testen, ob ich überhaupt eine Verbindung von Extern zu meiner Datenbank aufbauen kann.

Andere Frage:
Wenn ich auf ein PHP Script von Extern zugreife, reicht es wenn ich als ConnectivitätsString die IP Addresse + meine Php datei angebe?
Also so z.B: "42.42.42.42/Login.php"

Vielen Dank und verzei bitte wenn die Frage evtl. saublöd ist :D


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Kerugal:

verzei bitte wenn die Frage evtl. saublöd ist

Ach Quatsch, kann doch nicht jeder alles wissen :)

php ist dafür da, mit HTTP angesprochen zu werden. Das ist das Protokoll, das dein Browser benutzt. Man schickt eine Anfrage hin und kriegt eine Antwort zurück. Diese Antwort kann z.B. HTML-Code sein, also eine Webseite, die angezeigt wird. Wenn dann in dem Code was von einem Bild steht, schickt der Browser gleich noch eine HTTP-Anfrage los und dieses Mal ist die Antwort die Bilddatei. Jedes Mal, wenn dein Browser etwas lädt, ist es mindestens eine HTTP-Abfrage.

Du kannst aber auch ziemlich stumpfen plain text in einer HTTP-Antwort haben, oder XML, oder JSON, oder oder...

Wenn dich das interessiert, kannst du dir mal Fiddler besorgen. Das zeigt dir systemweit alle HTTP-Anfragen und deren Antworten an. Da sieht man ganz gut, wie viel HTTP dein System den ganzen Tag spricht.

In jedem Fall hat Unity dir für HTTP etwas bereit gelegt. Die klassische Variante ist die WWW-Klasse. Sie soll bald von UnityWebRequest abgelöst werden, ist aber noch nicht so weit. Du kannst also beruhigt WWW benutzen. Die Klasse funktioniert jedenfalls asynchron. Sie blockiert also nicht deinen Main Thread, was bedeutet: Das Spiel bleibt nicht stehen solange der HTTP-Verkehr läuft. Das ist auch gut so :). Es bedeutet allerdings auch, dass du nicht einfach sagen kannst:

var ergebnis = MachHTTP();
MachWasMit(ergebnis);

Weil "MachHTTP" (heißt natürlich anders) nur ein Startschuss ist, und das Ergebnis erst später da ist, der Code aber weiterläuft. Eben damit dein Spiel nicht blockiert wird.

Die übliche Lösung für das Problemchen ist, WWW in einer Coroutine zu benutzen. Ich weiß nicht, ob du Coroutines im Blick hast, aber ganz kurzgefasst: Eine Coroutine ist eine Methode, die unterbrochen und später weiter ausgeführt werden kann. Im Unity-Kontext kann eine Coroutine eine beliebige Anzahl von Frames warten. Zum Beispiel, bis ein WWW-Objekt fertig geworden ist. Der anschließende Code kann dann mit dem Ergebnis arbeiten. Coroutinen definiert und benutzt man so:

void Start() // Oder irgendeine andere Methode
{
  StartCoroutine(NameDerCoroutine());
}

private IEnumerator NameDerCoroutine()
{
  Debug.Log("Geht los.");
  yield return new WaitForSeconds(3);
  Debug.Log("Ist fertig.");
}

Kannst du so direkt testen. Um IEnumerator benutzen zu können, muss oben "System.Collections" in den using-Statements stehen. Deswegen steht das da übrigens auch standardmäßig in einem neuen Script.

"yield return" ist hier das wichtige Keyword. Ein WaitForSeconds-Objekt wartet x Sekunden (offensichtlich), aber es gibt noch einiges andere, was da hin kommen kann. Z.B. bedeutet

yield return null;

dass genau einen Frame gewartet wird.

Jetzt zu WWW. Das benutzt man so:

public string url = "https://forum.unity-community.de/uploads/profile/photo-thumb-5586.jpg"; // Kerugals profile pic

void Start() // Oder irgendeine andere Methode
{
  StartCoroutine(DownloadTexture(url));
}

private IEnumerator DownloadTexture(string url)
{
  var www = new WWW(url);

  yield return www; // Wait for download

  if(string.IsNullOrEmpty(www.error))
  {
    Debug.Log("Download successful.");
    renderer.material.mainTexture = www.texture;
  }
  else
  {
    Debug.LogError("Download Error: " + www.error);
  }
}

Wenn du keine WWWForm in dein WWW-Objekt packst, macht Unity eine sog. GET-Anfrage. Die schickt eine URL, die evtl Parameter enthält, und kriegt irgendetwas zurück. Das wird dann runtergeladen (in diesem Fall ein Bild) und du kannst damit machen, was du willst.

Mit WWWForm erstellst du eine POST-Anfrage. Eine solche Anfrage ist dafür da, dem Server etwas mitzuteilen, statt etwas zu erfragen. Wann immer du hier im Forum einen Beitrag abschickst, ist das eine POST-Anfrage. Die Daten, die du abschickst (z.B. dein Beitragsinhalt), sind in der Abfage im POST-Dictionary enthalten. Auch das kann man übrigens mit Fiddler sehen.

Dieses Dictionary, also diese Liste von "dies = das", so wie "beitrags-text = hallo leute, ...", wird von WWWForm gehandelt. Das funktioniert so:

public string url = "link-zu-deinem-php-script"; // Kerugals profile pic
public string player = "Hannes";
public int score = 10;

void Start() // Oder irgendeine andere Methode
{
  StartCoroutine(PostScore());
}

private IEnumerator PostScore() // Dieses mal ohne Parameter, geht auch
{
  var post = new WWWForm();
  post.AddField("Player", player);
  post.AddField("Score", score + "");
  
  var www = new WWW(url);

  yield return www;

  if(string.IsNullOrEmpty(www.error))
  {
    Debug.Log("Posting successful.");
    Debug.Log(www.text); // Mal testweise die Antwort vom Server anzeigen
  }
  else
  {
    Debug.LogError("Posting Error: " + www.error);
  }
}

Dein php-Script auf dem Server muss jetzt die POST-Daten auslesen. Das geht so:

<?
  $name = $_POST['Player'];
  $score = $_POST['Score'];

  // Nur mal testweise ausgeben
  echo $name.' hat '.$score.' Punkte.';
?>

Statt des echo musst du jetzt die Punkte in die Datenbank eintragen. Das führt hier natürlich zu weit, aber ich empfehle dieses Tutorial. PDO ist ganz gut zu lernen.

Wenn das alles erstmal läuft, musst du dir noch Gedanken um die Sicherheit machen. Wenn du Fiddler tatsächlich mal ausprobierst wirst du merken, dass man damit auch selber HTTP-Anfragen machen kann. Dann baue ich mir fix eine Anfrage mit sehr vielen Punkten und nichts hindert mich daran. Hier kann man sich mal Hashing angucken, aber dazu kommen wir dann, wenn es soweit ist ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Hallo zusammen :)

ich wollte mal ein kleines Update raushauen.
Ich habe jetzt ein kleines Php Login/Register Script, welches auch alles wunderbar funktioniert.

Da ich jetzt mit einem Kollegen das kleine Projekt umsetzen will, hat er mir geraten, dass ich doch auf "Laravel" umsteigen soll.

Ok, habe mir dieses "Laravel" auch mal angeschaut und auf dem V-Server installiert. (Ich bin etwas begeistert, was mit diesem Framwork
alles leichter geht).

Jetzt zu einem neuen Problem: Und zwar habe ich vorher, auf meinem simplen Php Script ein SSL-Zertifikat laufen gehabt.
Das war mit OpenSSL auch kein großes Ding...jetzt, wo aber "Laravel" darauf installiert ist, gibt es eigentlich nur noch Fehler..

Hat evtl. jemand Erfahrung damit, bzw. kennt sich jemand mit folgenden Punkten aus?

 

- ist bei einer ausschließlichen Datenbankverbindung, überhaupt ein SSL-Zertifikat notwendig? (Ich vermute, wenn die Übertragung nicht verschlüsselt ist, stellt es doch ein Sicherheitsrisiko da?)

- Laravel auf einem Apache Server mit PhpMyAdmin. Ich installiere Laravel und richte es unter den Apache Configs auf einer Subdomain ein Bsp: laravel.42.42.42.42.
 Sobald ich es über eine Subdomain regeln will, habe ich anschließend, nach der Installation von Laravel keinen Zugang mehr zu PhpMyAdmin, oder zu der Standard Index Seite. 
 (Hatte evtl. jemand schonmal das Problem und weiß evtl welchen Fehler ich in der Config von Apache vorgenommen habe?)

Ich wäre auch sehr Dankbar über ein gutes Tutorial, welches sich genau auf "Laravel - Ubuntu VServer - SSL" spezialisiert hat.
Zu den einzelnen Themen findet man ja genug, dass Problem ist, das mir die Kombination aus diesen Dreien schlaflose Nächte beschert :D

Ich hoffe das Alles war jetzt nicht zu verwirrend runtergeschrieben.
Vielen Dank im Vorraus!!!

Gruß Kerugal

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...