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

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个小时后即将上线的压力,冷静地吃了个晚饭再抽了两支烟然后还回来自问自答,以此自勉吧!

    评论

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站