已解决 mcl-kotlin插件-如何关闭ServerSocket以及里面的while循环
-
(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。
求大佬指点
-
-
你启动的任务完全是一个全堵塞任务, 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
-
好的,非常感谢,我去了解学习一下kotlin的协程方面的东西
-