unity3d
서버와의 통신
수색…
도망
웹 서버에서 데이터를 가져 오는 중입니다. 및 new WWW("https://urlexample.com");
URL이 있지만 두 번째 매개 변수가 없으면 Get을 수행합니다.
즉
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.
}
}
단순 우편 (우편 필드)
두 번째 매개 변수가있는 WWW의 모든 인스턴스는 게시물 입니다.
다음은 사용자 ID 와 암호 를 서버에 게시하는 예제입니다.
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");
}
}
게시 (파일 업로드)
서버에 파일 업로드도 게시물입니다. 아래처럼 WWW를 통해 쉽게 파일을 업로드 할 수 있습니다 :
서버에 Zip 파일 업로드
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!");
}
이 예에서는 coroutine 을 사용하여 파일을 준비하고 업로드합니다. Unity coroutines에 대해 더 알고 싶다면 Coroutines 를 방문하십시오.
서버에 요청 보내기
Unity를 클라이언트로 사용하는 서버와 통신하는 방법에는 여러 가지가 있습니다 (목적에 따라 일부 방법이 다른 방법보다 낫습니다). 먼저 서버와 서버간에 작업을 효율적으로 보낼 수있는 서버의 필요성을 결정해야합니다. 이 예에서는 검증을 위해 몇 가지 데이터를 서버에 보냅니다.
대부분 프로그래머는 이벤트를 수신하고 그에 따라 클라이언트에 응답하기 위해 서버에 처리기를 설치해야합니다. 그러나이 예제의 범위를 벗어납니다.
기음#:
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 개의 (선택 사항) 문자열 매개 변수를 사용합니다.
- 우리가 통신하고있는 서버의 URL
- 첫 번째 데이터
- 서버로 보내는 두 번째 데이터
사용자 이름과 암호는 서버로 보내는 선택적 데이터입니다. 이 예제에서는 데이터베이스 나 기타 외부 저장소에서 추가로 유효성을 검사하기 위해이 예제를 사용하고 있습니다.
이제 구조를 설정 했으므로 실제로 데이터를 전송하는 데 사용할 새 WebClient를 인스턴스화합니다. 이제 NameValueCollection에 데이터를로드하고 서버에 데이터를 업로드해야합니다.
UploadValues 함수는 3 가지 필수 매개 변수도 취합니다.
- 서버의 IP 주소
- HTTP 메소드
- 보내는 데이터 (이 경우 사용자 이름과 비밀번호)
이 함수는 서버에서 응답의 바이트 배열을 반환합니다. 반환 된 바이트 배열을 실제 문자열로 인코딩하여 응답을 조작하고 해부 할 수 있어야합니다.
다음과 같이 할 수 있습니다.
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에서 데이터를 보내거나받는 유일한 방법 일뿐입니다. 프로젝트에 따라 좀 더 효과적 일 수있는 몇 가지 다른 방법이 있습니다.