在Unity中客戶端與服務器端的2種通信方式(Socker)


15:17 2019/5/10
//第一種
using UnityEngine;
using System.Collections;
//引入庫
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine.UI;

public class UdpClient : MonoBehaviour
{
    string editString = "hello wolrd"; //編輯框文字

    //以下默認都是私有的成員
    Socket socket; //目標socket
    EndPoint serverEnd; //服務端
    IPEndPoint ipEnd; //服務端端口
    string recvStr; //接收的字符串
    string sendStr; //發送的字符串
    byte[] recvData = new byte[1024]; //接收的數據,必須為字節
    byte[] sendData = new byte[1024]; //發送的數據,必須為字節
    int recvLen; //接收的數據長度
    Thread connectThread; //連接線程

    //初始化
    void InitSocket()
    {
        //定義連接的服務器ip和端口,可以是本機ip,局域網,互聯網
        ipEnd = new IPEndPoint(IPAddress.Parse("192.168.1.133"), 7000);
        //定義套接字類型,在主線程中定義
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        //定義服務端
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        serverEnd = (EndPoint)sender;
        print("waiting for sending UDP dgram");

        //建立初始連接,這句非常重要,第一次連接初始化了serverEnd后面才能收到消息
        //SocketSend("hello");

        //開啟一個線程連接,必須的,否則主線程卡死
        connectThread = new Thread(new ThreadStart(SocketReceive));
        connectThread.Start();
    }

    public void OnBtnClick(string command)
    {
        Debug.Log("send command: " + command);
        this.SocketSend(command);
    }

    void SocketSend(string sendStr)
    {
        //清空發送緩存
        sendData = new byte[1024];
        //數據類型轉換
        sendData = Encoding.ASCII.GetBytes(sendStr);
        //發送給指定服務端
        socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
    }

    //服務器接收
    void SocketReceive()
    {
        //進入接收循環
        while (true)
        {
            //對data清零
            recvData = new byte[1024];
            //獲取客戶端,獲取服務端端數據,用引用給服務端賦值,實際上服務端已經定義好並不需要賦值
            recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
            print("message from: " + serverEnd.ToString()); //打印服務端信息
            //輸出接收到的數據
            recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen);
            print(recvStr);
        }
    }

    //連接關閉
    void SocketQuit()
    {
        //關閉線程
        if (connectThread != null)
        {
            connectThread.Interrupt();
            connectThread.Abort();
        }
        //最后關閉socket
        if (socket != null)
            socket.Close();
    }

    // Use this for initialization
    void Start()
    {
        InitSocket(); //在這里初始化
    }

    void OnGUI()
    {
        //editString = GUI.TextField(new Rect(10, 10, 100, 20), editString);
        //if (GUI.Button(new Rect(10, 30, 60, 20), "send"))
        //    SocketSend(editString);
    }

    // Update is called once per frame
    void Update()
    {

    }

    void OnApplicationQuit()
    {
        SocketQuit();
    }
}




//第二種
#region UDP客戶端類

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class UDPClient : MonoBehaviour {

public void OnBtnClick(string command)
{
Debug.Log("send command: " + command);
this.SocketSend(command);
}
public string recvStr;
public string UDPClientIP = "168.178.2.11";
string str = "客戶端01發送消息";
Socket socket;
EndPoint serverEnd;
IPEndPoint ipEnd;
byte[] recvData = new byte[1024];
byte[] sendData = new byte[1024];
int recvLen = 0;
Thread connectThread;

void Start()
{
//UDPClientIP = "168.178.2.11";//服務端的IP.自己更改
UDPClientIP = UDPClientIP.Trim();
InitSocket();
}

void InitSocket()
{
ipEnd = new IPEndPoint(IPAddress.Parse(UDPClientIP), 7000);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
serverEnd = (EndPoint)sender;
print("等待連接");
SocketSend(str);
print("連接");
//開啟一個線程連接
connectThread = new Thread(new ThreadStart(SocketReceive));
connectThread.Start();
}
void SocketSend(string sendStr)
{
try
{
//清空
sendData = new byte[1024];
//數據轉換
sendData = Encoding.UTF8.GetBytes(sendStr);
//發送給指定服務端
socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
}
catch (Exception e)
{

}

}

//接收服務器信息
void SocketReceive()
{
while (true)
{

recvData = new byte[1024];
try
{
recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
}
catch (Exception e)
{
}

print("信息來自: " + serverEnd.ToString());
if (recvLen > 0)
{
recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
}
print(recvStr);

}
}

//連接關閉
void SocketQuit()
{
//關閉線程
if (connectThread != null)
{
connectThread.Interrupt();
connectThread.Abort();
}
//最后關閉socket
if (socket != null)
socket.Close();
}
void OnApplicationQuit()
{
SocketQuit();
}

void Update()
{

}


}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM