iohao / ioGame

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

dotnetty连接发送命令后出现异常 #379

Open vincentZ-Z opened 1 week ago

vincentZ-Z commented 1 week ago

使用example里提供的example-for-spring做为服务端启动成功 客户端使用c# dotnetty连接成功,但是向服务端发送请求时出现异常:EINVAL (EINVAL) : invalid argument

发送请求部分

var body = new BodyRequestConfig<HelloReq, HelloReq>
{
    Title = "Hello",
    Cmd = 2,
    CmdMethod = 0,
    Data = new HelloReq
    {
        Name = "HelloReq"
    }
};
var message = ExternalKit.Of(CmdKit.Merge(2, 0));
message.Data = body.Data.ToByteString();
await ch.WriteAndFlushAsync(message.ToByteArray());

建立连接部分

var bootstrap = new Bootstrap();
bootstrap
    .Group(group)
    .Option(ChannelOption.TcpNodelay, true)
    .Option(ChannelOption.Allocator, PooledByteBufferAllocator.Default);
if (useLibuv)
{
    bootstrap.Channel<TcpChannel>();
}
else
{
    bootstrap.Channel<TcpSocketChannel>();
}
var handler =new WebSocketClientHandler(
    WebSocketClientHandshakerFactory.NewHandshaker(
            uri, WebSocketVersion.V13, null, true, new DefaultHttpHeaders()));
bootstrap.Handler(new ActionChannelInitializer<IChannel>(channel =>
{
    IChannelPipeline pipeline = channel.Pipeline;
    pipeline.AddLast(
        new HttpClientCodec(),
        new HttpObjectAggregator(8192),
        WebSocketClientCompressionHandler.Instance,
        handler);
}));
IChannel ch = await bootstrap.ConnectAsync(new IPEndPoint(ClientSettings.Host, ClientSettings.Port));
iohao commented 1 week ago

可参考

vincentZ-Z commented 1 week ago

可参考

目前就是参考这些做的,尝试了下使用dotnetty的话需要使用如下方式发送服务端就可以正常接收了,不知道是不是有更好的解决方案

var body = new BodyRequestConfig<HelloReq, HelloReq>
{
    Title = "Hello",
    Cmd = 2,
    CmdMethod = 0,
    Data = new HelloReq
    {
        Name = msg
    }
};
var message = ExternalKit.Of(CmdKit.Merge(2, 0));
message.Data = body.Data.ToByteString();
var binaryFrame = new BinaryWebSocketFrame(Unpooled.CopiedBuffer(message.ToByteArray()));
await ch.WriteAndFlushAsync(binaryFrame );

现在C#版sdk有新的进展吗,使用dotnetty会不会更好封装些?看java的SDK调用起来太方便了

iohao commented 1 week ago

C# SDK 和 TS SDK 会更好用一些,因为屏蔽了很多概念,直接面向接口编程(类似调用本地方法一般)。具体可以阅读使用示例

因为屏蔽了很多概念,所以将来内部支持 dotnetty 也是没问题的,并且不会影响现有代码,因为开发者是面向业务接口编程(类似调用本地方法一般)。

vincentZ-Z commented 1 week ago

C# SDK 和 TS SDK 会更好用一些,因为屏蔽了很多概念,直接面向接口编程(类似调用本地方法一般)。具体可以阅读使用示例

因为屏蔽了很多概念,所以将来内部支持 dotnetty 也是没问题的,并且不会影响现有代码,因为开发者是面向业务接口编程(类似调用本地方法一般)。

c# sdk哪里下载或者怎么使用nuget引用进来呢?示例里好像没有在客户端使用SDK进行连接

iohao commented 1 week ago

issue 还是 open 状态,也就是还没开放,预计 11 月。 示例是早期由热心市民提供的,在制作示例时还没有相关 SDK。

vincentZ-Z commented 1 week ago

issue 还是 open 状态,也就是还没开放,预计 11 月。 示例是早期由热心市民提供的,在制作示例时还没有相关 SDK。

SDK开发项目能不能申请加入,参考学习下

iohao commented 1 week ago

issue 还是 open 状态,也就是还没开放,预计 11 月。 示例是早期由热心市民提供的,在制作示例时还没有相关 SDK。

SDK开发项目能不能申请加入,参考学习下

感谢你的申请,但目前不能,后续会全部开源并接收 PR。

目前不接收申请是因为第一版本变化可能比较大,也懒得写相关的设计文档。由于变化可能比较大,多人合作反而会降低效率,所以建议在第一版本发布后参与 PR。

SDK 代码生成主要关注点之一是 api 的使用上,即 TS、C# 两者的使用 API 尽可能相似与统一。这样可以让前端开发者在切换语言时(使用不同的游戏引擎时)可以快速过渡,将学习成本拉到 0。