Unity + Socket + Protobuf+异步+粘包拆包断包 之 三

前面讲了SocketClient的结构,和 SocketManager的结构

本次讲一讲接下来的用法;

  • SocketMono的代码如下
using YY.SocketClient;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SocketMono : MonoBehaviour {

	// Use this for initialization
	void Start () {
        DontDestroyOnLoad(this.gameObject);
        this.InitManager();
    }

    private void InitManager()
    {
        HeartManager.Instance.CreateModel(gameObject);
    }

    private void Update()
    {
        SocketManager.Instance.UpdateProto();
    }

    private void OnApplicationQuit()
    {
        SocketManager.Instance.OnApplicationQuit();
    }
}

  • 写一个Demo.cs 来调用SocketManager:
    看不懂的前章,开头有链接
using YY.SocketClient;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Demo : MonoBehaviour {

    public string Address;
    public int Port;
	// Use this for initialization
	void Start () {
        SocketManager.Instance.Init(Address, Port);
    }
}

  • 前面SockerMono中 你会发现有这么一行 HeartManager.Instance.CreateModel(gameObject);
    它是用来控制心跳逻辑的,代码如下
using UnityEngine;
using YY.SocketClient;
using Com.Yy.Control.Proto;

public class HeartManager
{
    private static HeartManager instance;
    public static HeartManager Instance
    {
        get
        {
            if(instance == null)
            {
                instance = new HeartManager();
            }
            return instance;
        }
    }

    private string deviceUniqueIdentifier;
    public void Init()
    {
        this.deviceUniqueIdentifier = SystemInfo.deviceUniqueIdentifier;
    }

    public void CreateModel(GameObject obj)
    {
        obj.AddComponent<HeartModel>();
    }
    public void CToSDeviceCheck()
    {
        if (SocketManager.Instance.SocketClient.IsConnected)
        {
            var deviceNumber = this.deviceUniqueIdentifier;
            Message msg = new Message();
            msg.Event = Com.Yy.Control.Proto.Event.DeviceCheck;
            msg.DeviceNumber = deviceNumber;
            SocketManager.Instance.SendMessage(msg, (int)Com.Yy.Control.Proto.Event.DeviceCheck);
        }

    }

    public void CToSReconnect()
    {
        if (SocketManager.Instance.SocketClient.IsConnected)
        {
            Message msg = new Message();
            msg.Event = Com.Yy.Control.Proto.Event.Reconnection;
            //IsLogin 是否登陆用户
            //if (IsLogin)
            //{
            //    msg.UserId = UserInfo.Id;
            //}
            SocketManager.Instance.SendMessage(msg, (int)Com.Yy.Control.Proto.Event.Reconnection);
        }
    }
}

CToSReconnect 是重连用的 需要给服务器发送消息以告诉服务器 我要重新登陆用户。

  • HeartModel 是心跳具体逻辑 它会挂在在SocketMono对象上,代码如下:
using System.Threading;
using System;
using Com.Yy.Control.Proto;

namespace YY.SocketClient
{
    public class HeartModel : BaseModel<HeartModel>
    {

        private Thread thread;
        private bool isAlive = false;
        private bool isHeart = true;
        private Message heartMessage = new Message() { Event = Event.Heart };
        protected override void InitAddTocHandler()
        {
            this.AddTocHandler(Event.Heart, this.SToCHeart);
        }

        protected override void InitAddProtoDic()
        {
            this.AddProtoDic(Event.Heart);
            this.AddProtoDic(Event.DeviceCheck);
            this.AddProtoDic(Event.Reconnection);
        }

        void CToSHeart()
        {
            while (isAlive)
            {
                try
                {
                    if (!SocketManager.Instance.SocketClient.IsConnected)
                    {
                        Thread.Sleep(5000);
                        SocketManager.Instance.Reconnect();
                        continue;
                    }
                    if (!isHeart)
                    {
                        // "[CToSHeart]:Not Heart!!!!");
                    }
                    isHeart = false;
                    this.SendTos(heartMessage, Event.Heart);
                    Thread.Sleep(10000);
                }
                catch (Exception ex)
                {
                    //(ex, "Send heart beat error.");
                    Thread.Sleep(1000);
                }
            }
        }

        protected override void Start()
        {
            base.Start();
            
            this.thread = new Thread(new ThreadStart(this.CToSHeart));
            this.thread.IsBackground = true;
            this.isAlive = true;
            this.thread.Start();
        }
        
        void SToCHeart(object obj)
        {
            this.isHeart = true;
        }

        protected override void OnDestroy()
        {
            this.RemoveTocHandler(Event.Heart, this.SToCHeart);
            this.isAlive = false;
        }

        void OnApplicationQuit()
        {
            // "Heartmodel OnApplicationQuit");
            if(this.thread!= null)
            {
                this.thread.Abort();
            }
            this.isAlive = false;
        }
    }
}


  • 以上是Socket的基本逻辑和使用,下面一章我们将来讲一讲protobuff的使用
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值