iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;

Home Page:http://game.iohao.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SDK C#

iohao opened this issue · comments

SDK 的作用是为了方便各客户端与 ioGame 服务器对接,与游戏服务器交互。

SDK 整体来说封装了两种使用方式,分别是

  1. 主动请求方式:由客户端主动向服务器发起的请求。
  2. 监听回调方式;主要用于监听服务器的广播,当监听到广播时,会触发相应的回调方法。

主动请求方式

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 整体来说封装了两种使用方式,分别是

  1. 主动请求方式:由客户端主动向服务器发起的请求。
  2. 监听回调方式;主要用于监听服务器的广播,当监听到广播时,会触发相应的回调方法。

SDK 为主动请求的方式提供了两种编码风格,两者可以完成同样的工作。简单的请求推荐使用风格1,如果业务较复杂,可能会千万回调地狱的,推荐使用风格2。

SDK 封装了常用的协议碎片特性,开发者可以方便的传递及获取。

计划文档 SDK&对接文档