在单独的线程中初始化 Ktor 可以吗?

Is it OK to init Ktor in separate thread?

我正在寻找允许创建桌面 JVM 应用程序的库,该应用程序具有在 LAN 上侦听移动客户端连接的服务器功能。 JSON 配置和二进制数据将由客户端下载。找到了Ktor,看来符合要求。

我可以 运行 Ktor 在单独的线程中监视它在主 UI 线程中的状态吗?我发现 create app 运行ning Ktor 阻塞主线程的示例。 “状态”表示已连接的客户端数量、文件下载进度、基于其答案的客户端状态。

或者应该有其他方式启动Ktor,比如启动一个单独的进程并共享配置?或者使用其他服务器库?

我相信您会对使用 embeddedServer type of configuration 感兴趣。

一旦你创建了你的服务器,你需要调用 start 它接受一个参数 wait: Boolean 在他们的 KDoc 上声明:

    /**
     * Starts this [ApplicationEngine]
     *
     * @param wait if true, this function does not exit until application engine stops and exits
     * @return returns this instance
     */
    public fun start(wait: Boolean = false): ApplicationEngine

尚未执行任何测试来验证调用 server.start(false) 不会阻塞主线程,但从文档来看它确实符合您的要求。

希望对您有所帮助

编辑

我刚刚试过的示例代码:

fun main(args: Array<String>): Unit {

    val server = embeddedServer(Netty) {
    }
    
    
    server.start()
    
    println("Hello!")
}

产生了这个输出:

所以我会说 server.start()server.start(false)(它们是相同的,因为默认情况下参数设置为 false 不会阻塞主线程,你可以 运行您的应用程序与 Ktor