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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值