上一篇分享了一个unity的网络通信模块,这篇来将一下使用方法
完整的项目源码在这里:https://github.com/LiuFeng1011/UnityNetWork
1.创建协议类NetProtocols
客户端与服务器需要提前约定好通信协议以及每个协议的数据。
所有的客户端与服务器通信的协议定义在此类里。这里先定义一个TEST协议。
public class NetProtocols
{
//心跳
public const int HEART = 0x00000000;
//test
public const int TEST = 0x0FFFFFFF;
}
2.创建请求和响应
请求和响应用来序列化和反序列化数据,这些数据需要客户端和服务器约定好,所有的序列化和反序列化操作客户端和服务器都必须一致。请求为客户端发送给服务器的数据,响应为服务器发送给客户端的数据。同一个协议不一定必须存在请求和响应,比如有一些消息,客户端只是单纯的通知服务器一下,不需要任何返回数据,这样的协议则不需要响应类,同样,有些内容需要服务器主动下发给客户端,这样的协议则不需要定义请求类。
创建请求类TestReq:
首先所有的请求类需要继承Request,然后定义2个测试参数,并在构造函数中赋值。
然后重写GetProtocol以及Serialize方法,Serialize方法中对需要的数据进行序列化,服务器端按照一样的顺序进行反序列化。
public class TestReq : Request {
public int testInt;
public string testString;
public TestReq(int testInt,string testString){
this.testInt = testInt;
this.testString = testString;
}
public override int GetProtocol()
{
return NetProtocols.TEST;
}
public override void Serialize(DataStream writer)
{
base.Serialize(writer);
writer.WriteSInt32(testInt);
writer.WriteString16(testString);
}
}
创建响应类TestResp
首先响应类需要继承Resp,同样定义一个测试数据,并且重写GetProtocol以及Deserialize方法, Deserialize方法中对数据进行反序列化,同样需要和服务器的序列化顺序保持一致。
public class TestResp : Resp {
public string data;
public override int GetProtocol()
{
return NetProtocols.TEST;
}
public override void Deserialize(DataStream reader)
{
base.Deserialize(reader);
data = reader.ReadString16();
}
}
3.注册协议
为了在接收到服务器数据时能够找到相应的响应类,需要在ProtoManager中进行注册。所以我们创建一个类用来注册所有项目中的响应类:
public class RegisterResp {
//所有response必须要在这里注册
public static void RegisterAll(){
ProtoManager.Instance.AddProtocol<TestResp>(NetProtocols.TEST);
}
}
这样添加协议的步骤就基本完成了,接下来讲一下如何使用。
1.首先添加代理用来接收响应消息,所有想要接收的协议都需要添加上。
void Awake()
{
ProtoManager.Instance.AddRespDelegate(NetProtocols.TEST,Response);
}
2.在物件销毁时删除代理
void OnDisable()
{
ProtoManager.Instance.DelRespDelegate(NetProtocols.TEST,Response);
}
3.连接服务器
SocketHelper.GetInstance().Connect("IP",1,ConnectCallBack,null);
4.发送请求
TestReq req = new TestReq(1, "2");
req.Send();
5.接收请求
void Response(Resp r){
TestResp resp = (TestResp)r;
Debug.Log(resp.data);
}
到此,我们的unity客户端就可以正常和服务器收发消息啦。