向伺服器傳送請求

有很多方法可以使用 Unity 作為客戶端與伺服器進行通訊(根據你的目的,某些方法比其他方法更好)。首先,必須確定伺服器能夠有效地向伺服器傳送操作和從伺服器傳送操作的需要。對於此示例,我們將向我們的伺服器傳送一些資料以進行驗證。

最有可能的是,程式設計師將在其伺服器上設定某種處理程式來接收事件並相應地響應客戶端 - 但這超出了本示例的範圍。

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;
    }

首先要做的是拋棄使用允許我們使用 WebClient 和 NameValueCollection 類的 using 語句。

對於此示例,SendDataToServer 函式接受 3 個(可選)字串引數:

  1. 我們正在與之通訊的伺服器的 URL
  2. 第一條資料
  3. 我們傳送給伺服器的第二條資料

使用者名稱和密碼是我傳送給伺服器的可選資料。對於此示例,我們使用它然後從資料庫或任何其他外部儲存進一步驗證。

現在我們已經設定了我們的結構,我們將例項化一個新的 WebClient 用於實際傳送我們的資料。現在我們需要將資料載入到 NameValueCollection 中並將資料上傳到伺服器。

UploadValues 函式也包含 3 個必要引數:

  1. 伺服器的 IP 地址
  2. HTTP 方法
  3. 你要傳送的資料(我們的使用者名稱和密碼)

此函式返回來自伺服器的響應的位元組陣列。我們需要將返回的位元組陣列編碼為適當的字串,以便能夠操作和剖析響應。

人們可以這樣做:

if(opResponse.Equals(ReturnMessage.Success))
{
    Debug.Log("Unity client has successfully sent and validated data on server.");
}

現在你可能仍然感到困惑,所以我想我將簡要解釋如何處理響應伺服器端。

對於此示例,我將使用 PHP 來處理來自客戶端的響應。我建議使用 PHP 作為你的後端指令碼語言,因為它超級通用,易於使用,而且最重要的是快速。肯定有其他方法可以處理伺服器上的響應,但在我看來,PHP 是迄今為止 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";
   
}

所以這是最重要的部分 - ‘回聲’。當我們的客戶端將資料上傳到伺服器時,客戶端將響應(或資源)儲存到該位元組陣列中。一旦客戶端獲得響應,你就知道資料已經過驗證,並且一旦發生該事件,你就可以繼續在客戶端中繼續。你還需要考慮要傳送的資料型別(在某種程度上),以及如何最小化實際傳送的數量。

因此,這只是從 Unity 傳送/接收資料的一種方式 - 根據你的專案,還有其他一些方法可能對你更有效。