前面讲了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的使用