SDK C#
iohao opened this issue · comments
SDK 的作用是为了方便各客户端与 ioGame 服务器对接,与游戏服务器交互。
SDK 整体来说封装了两种使用方式,分别是
- 主动请求方式:由客户端主动向服务器发起的请求。
- 监听回调方式;主要用于监听服务器的广播,当监听到广播时,会触发相应的回调方法。
主动请求方式
SDK 为主动请求的方式提供了两种编码风格,两者可以完成同样的工作,开发者可根据自身业务选择使用。
请求方式一,编码风格-1
该请求方式是非阻塞的,开发者可设置响应回调与错误回调;优点:简洁,一体化。
const int dataInt = 1;
const int cmdMerge = 1;
// 【请求-非阻塞】【编码风格1】。可设置响应回调与错误回调;优点:简洁,一体化
RequestCommand.OfInt(cmdMerge, dataInt)
.OnCallback(result => { result.Log($"OfInt {result.GetInt()}"); })
.Execute();
// 【请求-非阻塞】【编码风格1】。可设置响应回调与错误回调;优点:简洁,一体化
RequestCommand.OfInt(cmdMerge, dataInt)
.OnCallback(result => { result.Log($"OfInt {result.GetInt()}"); })
.OnError(result =>
{
// 错误处理回调
result.Log($"{result.GetResponseStatus()}, {result.GetErrorInfo()}");
})
.Execute();
请求方式二,编码风格-2
该请求方式是非阻塞的,使用 await Task 机制实现;优点:可避免回调地狱。
const int dataInt = 1;
const int cmdMerge = 1;
// 【请求-非阻塞】【编码风格2】。使用 await Task 机制;优点:可避免回调地狱
var result1 = await RequestCommand.OfAwaitInt(cmdMerge, dataInt);
result1.Log($"OfAwaitInt {result1.GetInt()}");
// 【请求-非阻塞】【编码风格2】。使用 await Task 机制;优点:可避免回调地狱
let result = await RequestCommand.ofAwaitString(cmdMerge, "hello");
if (result.hasError())
{
// 错误处理
result.Log($"{result.GetResponseStatus()}, {result.GetErrorInfo()}");
}
result.Log($"OfInt {result.GetInt()}");
更多示例
- OnClickStudent 参数为对象,返回对象
- OnClickStudentList 参数为对象 List,返回对象 List
async void OnClickStudent()
{
var data = new Student
{
Age = 1,
Name = "ioGame"
};
// 【请求-非阻塞】【编码风格1】。可设置响应回调与错误回调;优点:简洁,一体化
RequestCommand.Of(5, data).OnCallback(result =>
{
var student = result.GetValue<Student>();
result.Log($"Of {student}");
}).Execute();
// 【请求-非阻塞】【编码风格2】。使用 await Task 机制;优点:可避免回调地狱
var result = await RequestCommand.OfAwait(5, data);
var student = result.GetValue<Student>();
result.Log($"Of {student}");
}
async void OnClickStudentList()
{
const int cmdMerge = 5;
var dataList = new List<IMessage>
{
new Student { Age = 1, Name = "java SDK" },
new Student { Age = 1, Name = "C# SDK" },
new Student { Age = 1, Name = "ts SDK" },
};
// 【请求-非阻塞】【编码风格1】。可设置响应回调与错误回调;优点:简洁,一体化
RequestCommand.OfValueList(cmdMerge, dataList).OnCallback(result =>
{
var list = result.ListValue<Student>();
result.Log($"OfValueList {list}");
}).Execute();
// 【请求-非阻塞】【编码风格2】。使用 await Task 机制;优点:可避免回调地狱
var result = await RequestCommand.OfAwaitValueList(cmdMerge, dataList);
var list = result.ListValue<Student>();
result.Log($"OfValueList {list}");
}
协议碎片
SDK 封装了常用的协议碎片特性,开发者可以方便的传递及获取。下面的示例分别演示了 Of、OfAwait 系列的 API,通常这些 API 都是对称的。
// 【请求-非阻塞】【编码风格1】。可设置响应回调与错误回调;优点:简洁,一体化
void OnClickBase()
{
const int dataInt = 1;
RequestCommand.OfInt(1, dataInt)
.OnCallback(result => { result.Log($"OfInt {result.GetInt()}"); })
.Execute();
RequestCommand.OfInt(1, dataInt)
.OnCallback(result => { result.Log($"OfInt {result.GetInt()}"); })
.Execute();
const long dataLong = 2L;
RequestCommand.OfLong(2, dataLong)
.OnCallback(result => { result.Log($"OfLong {result.GetLong()}"); })
.Execute();
const bool dataBool = true;
RequestCommand.OfBool(3, dataBool)
.OnCallback(result => { result.Log($"OfBool {result.GetBool()}"); })
.Execute();
const string dataString = "hello Execute";
RequestCommand.OfString(4, dataString)
.OnCallback(result => { result.Log($"OfString {result.GetString()}"); })
.Execute();
}
// 【请求-非阻塞】【编码风格2】。使用 await Task 机制;优点:可避免回调地狱
async Task OnClickBaseAwait()
{
const int dataInt = 1;
var result1 = await RequestCommand.OfAwaitInt(1, dataInt);
result1.Log($"OfAwaitInt {result1.GetInt()}");
const long dataLong = 2L;
var result2 = await RequestCommand.OfAwaitLong(2, dataLong);
result2.Log($"OfAwaitLong {result2.GetLong()}");
const bool dataBool = true;
var result3 = await RequestCommand.OfAwaitBool(3, dataBool);
result3.Log($"OfAwaitBool {result3.GetBool()}");
const string dataString = "hello Await";
var result4 = await RequestCommand.OfAwaitString(4, dataString);
result4.Log($"OfAwaitString {result4.GetString()}");
}
小结
SDK 整体来说封装了两种使用方式,分别是
- 主动请求方式:由客户端主动向服务器发起的请求。
- 监听回调方式;主要用于监听服务器的广播,当监听到广播时,会触发相应的回调方法。
SDK 为主动请求的方式提供了两种编码风格,两者可以完成同样的工作。简单的请求推荐使用风格1,如果业务较复杂,可能会千万回调地狱的,推荐使用风格2。
SDK 封装了常用的协议碎片特性,开发者可以方便的传递及获取。
计划文档 SDK&对接文档