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

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

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮