unity3d
Communicatie met server
Zoeken…
Krijgen
Get haalt gegevens op van de webserver. en new WWW("https://urlexample.com");
met een url maar zonder een tweede parameter doet een Get .
d.w.z
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
public string url = "http://google.com";
IEnumerator Start()
{
WWW www = new WWW(url); // One get.
yield return www;
Debug.Log(www.text); // The data of the url.
}
}
Eenvoudig bericht (berichtvelden)
Elke instantie van WWW met een tweede parameter is een bericht .
Hier is een voorbeeld om gebruikers-ID en wachtwoord op de server te plaatsen.
void Login(string id, string pwd)
{
WWWForm dataParameters = new WWWForm(); // Create a new form.
dataParameters.AddField("username", id);
dataParameters.AddField("password", pwd); // Add fields.
WWW www = new WWW(url+"/account/login",dataParameters);
StartCoroutine("PostdataEnumerator", www);
}
IEnumerator PostdataEnumerator(WWW www)
{
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log(www.error);
}
else
{
Debug.Log("Data Submitted");
}
}
Posten (een bestand uploaden)
Een bestand uploaden naar de server is ook een bericht. U kunt eenvoudig een bestand uploaden via WWW , zoals hieronder:
Upload een zipbestand naar de server
string mainUrl = "http://server/upload/";
string saveLocation;
void Start()
{
saveLocation = "ftp:///home/xxx/x.zip"; // The file path.
StartCoroutine(PrepareFile());
}
// Prepare The File.
IEnumerator PrepareFile()
{
Debug.Log("saveLoacation = " + saveLocation);
// Read the zip file.
WWW loadTheZip = new WWW(saveLocation);
yield return loadTheZip;
PrepareStepTwo(loadTheZip);
}
void PrepareStepTwo(WWW post)
{
StartCoroutine(UploadTheZip(post));
}
// Upload.
IEnumerator UploadTheZip(WWW post)
{
// Create a form.
WWWForm form = new WWWForm();
// Add the file.
form.AddBinaryData("myTestFile.zip",post.bytes,"myFile.zip","application/zip");
// Send POST request.
string url = mainUrl;
WWW POSTZIP = new WWW(url,form);
Debug.Log("Sending zip...");
yield return POSTZIP;
Debug.Log("Zip sent!");
}
In dit voorbeeld gebruikt het de coroutine om het bestand voor te bereiden en te uploaden. Als u meer wilt weten over Unity-coroutines, bezoekt u Coroutines .
Een verzoek naar de server verzenden
Er zijn veel manieren om te communiceren met servers die Unity als client gebruiken (sommige methoden zijn beter dan andere, afhankelijk van uw doel). Eerst moet de behoefte van de server worden bepaald om bewerkingen van en naar de server te kunnen verzenden. Voor dit voorbeeld sturen we enkele gegevens naar onze server om te valideren.
Hoogstwaarschijnlijk zal de programmeur een soort handler op zijn server hebben ingesteld om gebeurtenissen te ontvangen en dienovereenkomstig op de client te reageren - dat valt echter buiten het bereik van dit voorbeeld.
C #:
using System.Net;
using System.Text;
public class TestCommunicationWithServer
{
public string SendDataToServer(string url, string username, string password)
{
WebClient client = new WebClient();
// This specialized key-value pair will store the form data we're sending to the server
var loginData = new System.Collections.Specialized.NameValueCollection();
loginData.Add("Username", username);
loginData.Add("Password", password);
// Upload client data and receive a response
byte[] opBytes = client.UploadValues(ServerIpAddress, "POST", loginData);
// Encode the response bytes into a proper string
string opResponse = Encoding.UTF8.GetString(opBytes);
return opResponse;
}
Het eerste dat men moet doen, is het gebruik van statements die ons in staat stellen de klassen WebClient en NameValueCollection te gebruiken.
Voor dit voorbeeld neemt de SendDataToServer-functie 3 (optionele) stringparameters op:
- URL van de server waarmee we communiceren
- Eerste stukje gegevens
- Tweede stuk gegevens dat we naar de server sturen
De gebruikersnaam en het wachtwoord zijn de optionele gegevens die ik naar de server verzend. Voor dit voorbeeld gebruiken we het om vervolgens verder te worden gevalideerd vanuit een database of een andere externe opslag.
Nu we onze structuur hebben ingesteld, gaan we een nieuwe WebClient in gebruik nemen om onze gegevens daadwerkelijk te verzenden. Nu moeten we onze gegevens in onze NameValueCollection laden en de gegevens naar de server uploaden.
De functie UploadValues neemt ook 3 noodzakelijke parameters op:
- IP-adres van de server
- HTTP-methode
- Gegevens die u verzendt (in ons geval de gebruikersnaam en het wachtwoord)
Deze functie retourneert een bytearray van het antwoord van de server. We moeten de geretourneerde byte-array coderen in een juiste tekenreeks om de reactie daadwerkelijk te kunnen manipuleren en ontleden.
Je zou zoiets kunnen doen:
if(opResponse.Equals(ReturnMessage.Success))
{
Debug.Log("Unity client has successfully sent and validated data on server.");
}
Nu kunt u nog steeds in de war zijn, dus ik denk dat ik een korte uitleg zal geven over hoe een antwoordserver eenzijdig kan worden behandeld.
Voor dit voorbeeld zal ik PHP gebruiken om de reactie van de client af te handelen. Ik zou aanraden PHP als je back-end scripttaal te gebruiken, omdat het super veelzijdig, gemakkelijk te gebruiken en vooral snel is. Er zijn absoluut andere manieren om een antwoord op een server af te handelen, maar naar mijn mening is PHP veruit de eenvoudigste en gemakkelijkste implementatie in Unity.
PHP:
// Check to see if the unity client send the form data
if(!isset($_REQUEST['Username']) || !isset($_REQUEST['Password']))
{
echo "Empty";
}
else
{
// Unity sent us the data - its here so do whatever you want
echo "Success";
}
Dus dit is het belangrijkste onderdeel - de 'echo'. Wanneer onze klant de gegevens naar de server uploadt, slaat de klant de reactie (of bron) op in die byte-array. Zodra de client het antwoord heeft, weet u dat de gegevens zijn gevalideerd en kunt u doorgaan naar de client zodra die gebeurtenis is gebeurd. U moet ook nadenken over welk type gegevens u (tot op zekere hoogte) verzendt en hoe u de hoeveelheid die u daadwerkelijk verzendt, kunt minimaliseren.
Dit is dus maar één manier om gegevens van Unity te verzenden / ontvangen - er zijn nog andere manieren die voor u effectiever kunnen zijn, afhankelijk van uw project.