Unity nâng cao>>P1 >> Server socket trong Unity

Chào các bạn! Chúng ta bắt đầu nghiên cứu sâu hơn về Unity. Trong phần này chúng ta cùng nhau xây dựng một server socket. Chú ý bài viết này dành cho các bạn đã học qua các bài basic lần trước.

Chúng ta cần hiều những kiến thức cơ bản về socket và vai trò của nó trong các ứng dụng.
- Thông tin cơ bản về socket : Internet socket Wiki
- Sau đây là các bước thực hiện để tạo một server lắng nghe trong Unity:
- Vai trò: Giúp bạn nhận các thông tin từ bên ngoài và từ client gửi đến. Socket là kỹ thuật giúp bạn truyền dữ liệu theo bytes.

Bước 1:
- Tạo mới một Project tên là "ServerSocket", save scence thành "Server".
- Tạo một thư mục có tên Script, sau đó tạo một Class C# với tên: "MyServerListener"
- Paste đoạn code sau vào class mới:

// By LangVV

//www.3din.com.vn

using UnityEngine;

using System.Collections;

using System.Threading;

using System.Net.Sockets;

using System.IO;

using System;

public class MyServerListener : MonoBehaviour

{

private bool mRunning;

Thread mThread;

TcpListener tcp_Listener = null;

private string remoteIp = "192.168.1.13";

private int remotePort = 54321;

void Start()

{

Debug.Log("");

RestartServer();

}

void OnGUI(){

if(GUI.Button(new Rect(10,10,100,30),"Restart Server")){

RestartServer();

}

remoteIp = GUI.TextField(new Rect(120,10,100,20),remoteIp);

remotePort = int.Parse(GUI.TextField(new Rect(230,10,40,20),remotePort.ToString()));

}

void RestartServer(){

stopListening();

mRunning = true;

ThreadStart ts = new ThreadStart(StartListening);

mThread = new Thread(ts);

mThread.Start();

}

public void stopListening()

{

mRunning = false;

}

void StartListening()

{

try

{

Debug.Log("Before Started at host:"+remoteIp+", port "+remotePort);

tcp_Listener = new TcpListener(System.Net.IPAddress.Parse(remoteIp), remotePort); //System.Net.IPAddress

tcp_Listener.Start();

Debug.Log("Server Started at host:"+remoteIp+", port "+remotePort);

// Buffer for reading data

Byte[] bytes = new Byte[256];

String data = null;

int counter = 0;

while (mRunning)

{

// check if new connections are pending, if not, be nice and sleep 100ms

if (!tcp_Listener.Pending())

{

Thread.Sleep(100);

}

else

{

print("1");

TcpClient client = tcp_Listener.AcceptTcpClient();

print("2");

NetworkStream stream = client.GetStream();

print("3");

counter++;

int i;

data = null;

// Loop to receive all the data sent by the client.

while((i = stream.Read(bytes, 0, bytes.Length))!=0)

{

// Translate data bytes to a ASCII string.

data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);

Debug.Log("Received: {0}"+ data +" , c = "+ counter);

//txtLog1.guiText.text = "Received: {0}"+ data +" , c = "+ counter;

// Process the data sent by the client.

data = data.ToUpper();

byte[] msg = System.Text.Encoding.ASCII.GetBytes(data+" counter:"+counter);

// Send back a response.

stream.Write(msg, 0, msg.Length);

Debug.Log("Unity sent to Flex: {0}"+ data );

}

//reader.Close();

client.Close();

Debug.Log("Client closed" );

}

} // while

}

catch (ThreadAbortException)

{

Debug.Log("Error");

}

finally

{

mRunning = false;

tcp_Listener.Stop();

}

}

void OnApplicationQuit()

{

// stop listening thread

stopListening();

// wait fpr listening thread to terminate (max. 500ms)

mThread.Join(500);

tcp_Listener.Stop();

}

}

Chú ý:
- Địa chỉ IP của máy tính bạn mặc định trên window là 127.0.0.1, hoặc bạn có thể thay thế bằng địa chỉ IP Internet.
private string remoteIp = "192.168.1.13"; // hoac 127.0.0.1

- Cổng ta cần có thể chọn bất kỳ, nhưng chú ý nên chọn từ 50000 trở lên

private int remotePort = 54321;



Bước 2: Kéo đoạn code đó vào trong Main camera

Nhấn Play để kiểm tra. Nếu bạn nhìn trên status thấy câu lệnh sau thì hành thì kết quả đã thành công: "Debug.Log("Server Started at host:"+remoteIp+", port "+remotePort);"

Giải thích hoạt động:
Trong lớp "MyServerListener ", chúng ta sử dụng các kỹ thuật cơ bản sau:
+ Sử dụng Thread để giúp quản lý các tiến trình được tốt hơn trong quá trình lắng nghe
+ Khởi tạo một TCPListener(với 2 tham số cơ bản: IP và Port), đó là câu lệnh quan trọng khởi tạo một listener.
+ Đối tượng thuộc lớp NetworkStream là yếu tố quan trọng tiếp theo để nhận dữ liệu từ Client gửi đến. "NetworkStream stream = client.GetStream();"
+ Vòng lặp While để nhận đầy đủ dữ liệu từ client gửi đến cũng là yếu tố không thể thiếu.

Trong bài tới mình sẽ giúp các bạn tạo ra Client Socket, để truyền dữ liệu tới Server.