unity socket客戶端

也是從多方找的,做完到了收到數據解析完轉換成float數據報錯,不轉換float的話正常傳輸沒問題

using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Diagnostics;
//收到消息後的委託回調
public delegate void ReceiveCallBack(string content);

public class LOSocket : MonoBehaviour {

    //可以創建的Socket端口類型
    public enum LOSocketType
    {
        CLIENT = 0,
        SERVER = 1,
    }
    #region --------取消構造器
    private LOSocket()
    {
    }

    #endregion

    #region --------公共代碼
    //通過靜態方法獲取不同的端口類型
    public static LOSocket GetSocket(LOSocket.LOSocketType type)
    {
        LOSocket socket = null;


        switch (type)
        {
            case LOSocketType.CLIENT:
                {
                    //創建一個新的客戶端
                    socket = new LOSocket();
                    break;
                }
            case LOSocketType.SERVER:
                {
                    //獲取服務端
                    socket = GetServer();
                    break;
                }
        }

        return socket;
    }

    #endregion
    #region --------客戶端部分代碼
    private Socket clientSocket;

    //聲明客戶端收到服務端返回消息後的回調委託函數
    private ReceiveCallBack clientReceiveCallBack;
    //用來存儲服務端返回的消息數據
    byte[] Buffer = new byte[1024];

    //public void ReceiveReturn(ReceiveCallBack ccb)
    //{
    //    this.clientReceiveCallBack = ccb;
    //}

    //初始化客戶端Socket信息
    public void InitClient(string ip, int port, ReceiveCallBack ccb)
    {
        this.clientReceiveCallBack = ccb;
        this.clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        IPAddress address = IPAddress.Parse(ip);
        IPEndPoint ep = new IPEndPoint(address, port);

        this.clientSocket.Connect(ep);
        //開始異步等待接收服務端消息
        this.clientSocket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new System.AsyncCallback(ReceiveFromServer), this.clientSocket);
    }

    //收到服務端返回消息後的回調函數
    void ReceiveFromServer(System.IAsyncResult ar)
    {
        //獲取當前正在工作的Socket對象
        Socket worker = ar.AsyncState as Socket;
        int ByteRead = 0;
        try
        {
            //接收完畢消息後的字節數
            ByteRead = worker.EndReceive(ar);
        }
        catch (System.Exception ex)
        {
            this.clientReceiveCallBack(ex.ToString());
        }
        if (ByteRead > 0)
        {
            string Content = Encoding.Default.GetString(Buffer);
            //msg1 = Content;
            // SendMessage(Content);
            UnityEngine.Debug.Log("接收的信息時:"+ Content);
            //通過回調函數將消息返回給調用者
            this.clientReceiveCallBack(Content);
        }
        //繼續異步等待接受服務器的返回消息
        worker.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new System.AsyncCallback(ReceiveFromServer), worker);
    }


    //private void OnDestroy()
    //{

    //    clientSocket.Shutdown(SocketShutdown.Both);
    //    clientSocket.Close();
    //}



    //客戶端主動發送消息
    public void SendMessage(string message)
    {
        if (message == null)
            return;

        message += "\r\n";
        byte[] sendData = Encoding.UTF8.GetBytes(message);

        //異步發送消息請求
        clientSocket.BeginSend(sendData, 0, sendData.Length, SocketFlags.None, new System.AsyncCallback(SendToServer), clientSocket);
    }
    //發送消息結束的回調函數
    void SendToServer(System.IAsyncResult ar)
    {
        Socket worker = ar.AsyncState as Socket;
        worker.EndSend(ar);
    }

    #endregion


    #region -------服務器部分代碼
    //服務器端收到消息的存儲空間
    byte[] ReceiveBuffer = new byte[1024];
    //服務器收到消息後的回調委託
    private ReceiveCallBack callback;

    //單例模式  
    private static LOSocket serverSocket;
    private static LOSocket GetServer()
    {
        if (serverSocket == null)
        {
            serverSocket = new LOSocket();
        }
        return serverSocket;
    }

    //初始化服務器信息
    public void InitServer(ReceiveCallBack cb)
    {
        this.callback = cb;
        // 1.
        Socket server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        // 2.
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 2222);
        // 3.
        server_socket.Bind(endPoint);
        // 4.
        server_socket.Listen(10);
        // 5.開始異步等待客戶端的請求鏈接
        server_socket.BeginAccept(new System.AsyncCallback(Accept), server_socket);

        this.callback("開啓服務器" + endPoint.ToString());
    }

    //接受到客戶端的鏈接請求後的回調函數
    void Accept(System.IAsyncResult ar)
    {
        //獲取正在工作的Socket對象 
        Socket socket = ar.AsyncState as Socket;
        //存儲異步操作的信息,以及用戶自定義的數據  
        Socket worker = socket.EndAccept(ar);

        SocketError error;

        //開始異步接收客戶端發送消息內容
        worker.BeginReceive(ReceiveBuffer, 0, ReceiveBuffer.Length, SocketFlags.None, new System.AsyncCallback(Receive), worker);
        //繼續異步等待新的客戶端鏈接請求
        socket.BeginAccept(new System.AsyncCallback(Accept), socket);

    }
    //服務端收到客戶端的消息後的回調函數
    void Receive(System.IAsyncResult ar)
    {
        //獲取正在工作的Socket對象
        Socket worker = ar.AsyncState as Socket;
        int ByteRead = 0;
        try
        {
            ByteRead = worker.EndReceive(ar);
        }
        catch (System.Exception ex)
        {
            this.callback(ex.ToString());
        }
        if (ByteRead > 0)
        {
            string Content = Encoding.Default.GetString(ReceiveBuffer);
            this.callback(Content);
        }
        //繼續異步等待客戶端的發送消息請求
        worker.BeginReceive(ReceiveBuffer, 0, ReceiveBuffer.Length, SocketFlags.None, new System.AsyncCallback(Receive), worker);
    }
    #endregion
}

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ClientScript : MonoBehaviour {

    string msg = "hello";
    public GameObject cube;

    // Use this for initialization

    LOSocket client;
    void Start()
    {
        client = LOSocket.GetSocket(LOSocket.LOSocketType.CLIENT);
        //"192.168.101.21", 6666

        client.InitClient("192.168.101.136", 10086,((string content) => {
            //收到服務器的回饋信息
            //client.SendMessage("我是socket發送的數據爲:" + content);
            SocketTransform.Start(cube, content);
        }));
        

    }

    private void Update()
    {
        
    }

    void OnGUI()
    {
        msg = GUI.TextField(new Rect(0, 0, 500, 40), msg);//Convert.ToString(transform.position)
        if (GUI.Button(new Rect(0, 50, 100, 30), "Send"))
        {

            client.SendMessage(msg);
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章