首先基于C#的Socket的BeginReceive异步接收和BeginSend异步发送数据的底层的实现也是多线程处理,当然也可以自己用线程来实现;C#的异步Socket简单的例子和教程网上很多,在此就不再累赘了;结合刚开始说的,C#的异步Socket实际是多线程实现,那么我们在Unity中使用的时候就会遇到我们不能在C#的Socket的异步回调函数中访问Unity的组件的问题;一开始我试了用事件来处理,就是Socket接收到消息,触发一个事件,在事件回调函数访问Unity的组件,然而这是不可行,查了一下资料了解到事件的回调是在调用线程执行的,也就是说兜了一个圈还是在子线程执行,还是不能访问Unity的组件;涉及到多线程数据的处理,很多时候都会想到使用生产者-消费者模式来异步处理数据,这里我们就可以把异步Socket的线程当作生产者,Unity主线程作为消费者,首先要做的就是创建一个数据容器来存放异步Socket接收到的数据,然后主线程不断的来取数据,如果有数据,那么就把数据交付给对应的处理逻辑;我想的一个简单的实现就是创建一个专门用来派发接收到的数据的组件,也就是一个MonoBehaviour,然后使用每帧执行、固定时间执行函数(update,lateupdate,fixedupdate)或者使用协程来检测数据容器是否有数据,如果有数据就交付给相应的处理逻辑,想法大概就是这样,如下是主要逻辑的简单实现,见笑了!
首先消息简单定义:
public abstract class Message{
public static T Parse<T>(byte[] data)where T:Message {
\\TODO 解析数据,根据自己的数据定义,可以使用工厂模式来产生不同的Message子类
}
}
接下来是消息容器:消息容器比较简单就是一个Message队列
using MessageBuffer