fk620057147 2019-06-24 16:38 采纳率: 0%
浏览 2667
已结题

C# DotNetty 连接服务器异常:DotNetty.Transport.Channels.ClosedChannelException: 发生 I/O 错误。

一、问题
DotNetty使用ConnectAsync连接服务器,在VS中调试运行,一切正常;而在打包目录中直接运行就会报错。

二、相关代码

private async Task ConnectServerAsync()
{
    try
    {
        var con = new ConnectHandler(m_sLoginRet);
        con.OnChatServerConnected += (sender, e) =>
        {
            ConnectCallBack(true);
        };
        con.OnChatServerDisConnected += (sender, e) => 
        {
            ConnectCallBack(false);
        };
        con.OnRecieveMessage += (sender, e) =>
        {
            Msg msg = e.data as Msg;
            this.m_mainForm.OnRecieveMessage(msg);
        };
        this.m_mainForm.m_connection = con;

        var group = new MultithreadEventLoopGroup();
        var bootstrap = new Bootstrap();
        bootstrap
            .Group(group)
            .Channel<TcpSocketChannel>()
            .Option(ChannelOption.TcpNodelay, true)
            .Handler(new ActionChannelInitializer<ISocketChannel>(channel =>
            {
                IChannelPipeline pipeline = channel.Pipeline;

                pipeline.AddLast("frameDecoder", new ProtobufVarint32FrameDecoder());
                pipeline.AddLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
                pipeline.AddLast("decoder", new ProtobufDecoder(Msg.Parser));
                pipeline.AddLast("encoder", new ProtobufEncoder());

                pipeline.AddLast("ping", new IdleStateHandler(0, 10, 0));
                pipeline.AddLast("connect", con);
            }));

        **_IChannel bootstrapChannel = await bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse("192.168.20.84"), 9877));_**
    }
    catch (Exception ex)
    {
        ConnectCallBack(false, ex.StackTrace);
    }
    finally
    {
        //group.ShutdownGracefullyAsync().Wait(10000);
    }
}


private void ConnectChatServer()
{
    try
    {
        this.Text = this.m_strAppName + " 正在连接聊天服务器,请稍后...";
        Task.Run(() => ConnectServerAsync());
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

1.ConnectChatServer 函数在主线程中调用。
2.IChannel bootstrapChannel = await bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse("192.168.20.84"), 9877)); 在VS中调试运行一切正常。而手动运行则会报错。

三、报错信息

  •   [DotNetty.Transport.Channels.ClosedChannelException]    {DotNetty.Transport.Channels.ClosedChannelException: 发生 I/O 错误。
    

    在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    在 DotNetty.Transport.Bootstrapping.Bootstrap.d__15.MoveNext()
    --- 引发异常的上一位置中堆栈跟踪的末尾 ---
    在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
    在 TotRobot.LoginForm.d__21.MoveNext()} DotNetty.Transport.Channels.ClosedChannelException

    请问有大神碰到过类似的情况吗?不胜感激!!!

    C币不多,如果确实能解决问题或对解决问题有帮助请私信我。

  • 写回答

2条回答 默认 最新

  • fk620057147 2019-06-24 19:47
    关注

    问题解决了。
    1.通过部分代码注释,发现出问题的代码是

    pipeline.AddLast("decoder", new ProtobufDecoder(Msg.Parser));
    pipeline.AddLast("encoder", new ProtobufEncoder());
    

    可见该异常与Google.Protobuf.dll有关。

    2.然后在独立目录中运行程序,用VS挂起调试,得到调试输出;然后和直接在VS中调试运行产生的日志做对比,发现前者少加载了一个程序集“DotNetty.Handlers.dll”,于是想到了手动预加载这个程序集。

    3.看到了帖子 https://blog.csdn.net/tytmty/article/details/37539187 ,其中第三条让我突然想到,是不是打包的目录中缺少了 .exe.config 文件。立刻从bin目录复制过来,问题解决!

    4.解决这个问题的过程真的是非常曲折,结果也令我大跌眼镜。好在顶住了2个小时后即将上线的压力,冷静地吃了个晚饭再抽了两支烟然后还回来自问自答,以此自勉吧!

    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境