MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

    已解决 mcl-kotlin插件-如何关闭ServerSocket以及里面的while循环

    开发交流
    2
    3
    249
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Y
      Yuanning 最后由 编辑

      (kotlin新手求助)
      我在onEnable中初始化了并监听了一个ServerSocket,想要在onDisable函数中关闭它,但是失败了

      报错大概信息如下:
      MIRAI CONSOLE CRASH REPORT.
      Console has take too long to shutdown.

      我的onDisable函数是这么写的

          override fun onDisable() {
              logger.info { "准备关闭socket" }
              serverToClose?.close()
          }
      

      注:
      serverToClose的初始化操作如下:

      PluginMain.launch {
                  try {
                      println("Socket服务器开始运行...")
                      val serverSocket = ServerSocket(12345)
                      serverSocketToClose = serverSocket
                      while (true) {
                          val socket = serverSocket.accept()
                          println("接受了一个socket链接")
                          Thread(ServerHandler(socket)).start()
                      }
                  } catch (e: Exception) {
                      e.printStackTrace()
                  }
              }
      

      但是在“准备关闭socket”这句话输出前就已经报错了,也就是我貌似无法在onDisable中关闭ServerSocket以及试图退出while循环

      不知道应该怎么在mcl退出时,关闭之前的ServerSocket以及while循环,从而正常退出mcl。

      求大佬指点

      1 条回复 最后回复 回复 引用 0
      • Topic has been marked as a question  Y Yuanning 
      • Karlatemp
        Karlatemp 最后由 编辑

        你启动的任务完全是一个全堵塞任务, kotlin 本身没办法直接中断这个任务的执行

        你需要使用

            PluginMain.launch {
                val server = ServerSocket(0)
                server.use { // = java try-with-resource
                    runInterruptible(Dispatchers.IO) {
                        while (true) {
                            server.accept()
                        }
                    }
                }
            }
        

        关于 kotlin 协程, 请参考 https://github.com/Kotlin-zh/KEEP/blob/master/proposals/coroutines.md

        1 条回复 最后回复 回复 引用 0
        • Y
          Yuanning 最后由 编辑

          好的,非常感谢,我去了解学习一下kotlin的协程方面的东西

          1 条回复 最后回复 回复 引用 0
          • Topic has been marked as solved  Y Yuanning 
          • 1 / 1
          • First post
            Last post
          Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact