unity3d
Kommunikation med server
Sök…
Skaffa sig
Get hämtar data från webbservern. och new WWW("https://urlexample.com");
med en url men utan en andra parameter gör en Get .
dvs.
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.
}
}
Enkel post (postfält)
Varje instans av WWW med en andra parameter är ett inlägg .
Här är ett exempel för att publicera användar-ID och lösenord på servern.
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");
}
}
Inlägg (Ladda upp en fil)
Ladda upp en fil till servern är också ett inlägg. Du kan enkelt ladda upp en fil genom WWW , som nedan:
Ladda upp en zip-fil till servern
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!");
}
I det här exemplet använder den koroutinen för att förbereda och ladda upp filen, om du vill veta mer om Unity coroutines, besök Coroutines .
Skickar en begäran till servern
Det finns många sätt att kommunicera med servrar som använder Unity som klient (vissa metoder är bättre än andra beroende på ditt syfte). Först måste man bestämma serverns behov för att effektivt kunna skicka operationer till och från servern. I det här exemplet skickar vi ett par data till vår server för att valideras.
Troligen kommer programmeraren att ha satt upp någon form av hanterare på sin server för att ta emot händelser och svara tillbaka till klienten i enlighet därmed - men det är utanför ramen för detta exempel.
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;
}
Det första man måste göra är att slänga in sina uttalanden som tillåter oss att använda klasserna WebClient och NameValueCollection.
För det här exemplet tar SendDataToServer-funktionen in 3 (valfritt) strängparametrar:
- Ur servern vi kommunicerar med
- Första uppgiften
- Andra data som vi skickar till servern
Användarnamnet och lösenordet är valfria data som jag skickar till servern. I det här exemplet använder vi det för att sedan valideras ytterligare från en databas eller annan extern lagring.
Nu när vi har konfigurerat vår struktur kommer vi att initiera en ny WebClient som ska användas för att faktiskt skicka våra data. Nu måste vi ladda våra data i vår NameValueCollection och ladda upp data till servern.
UploadValues-funktionen tar också in 3 nödvändiga parametrar:
- IP-adress för servern
- HTTP-metod
- Data du skickar (användarnamn och lösenord i vårt fall)
Denna funktion returnerar en byte-grupp av svaret från servern. Vi måste koda det returnerade byte-arrayet i en rätt sträng för att faktiskt kunna manipulera och dissekera svaret.
Man kan göra något liknande:
if(opResponse.Equals(ReturnMessage.Success))
{
Debug.Log("Unity client has successfully sent and validated data on server.");
}
Nu kanske du fortfarande är förvirrad så jag antar att jag kommer att ge en kort förklaring av hur man hanterar en svarssidersidig.
I det här exemplet kommer jag att använda PHP för att hantera svaret från klienten. Jag rekommenderar att du använder PHP som ditt back-end skriptspråk eftersom det är super mångsidigt, enkelt att använda och mest av allt snabbt. Det finns definitivt andra sätt att hantera ett svar på en server men enligt min mening är PHP den absolut enklaste och enklaste implementeringen av 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";
}
Så detta är den viktigaste delen - "ekot". När vår klient laddar upp data till servern sparar klienten svaret (eller resursen) i den byte-matrisen. När klienten har svaret, vet du att uppgifterna har validerats och du kan gå vidare i klienten när den händelsen har inträffat. Du måste också tänka på vilken typ av data du skickar (i viss utsträckning) och hur du minimerar det belopp du faktiskt skickar.
Så detta är bara ett sätt att skicka / ta emot data från Unity - det finns några andra sätt som kan vara mer effektiva för dig beroende på ditt projekt.