首页 > 解决方案 > 在单独的线程中初始化 Ktor 可以吗?

问题描述

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

我可以在单独的线程中运行 Ktor 以监控其在主 UI 线程中的状态吗?我发现创建应用程序运行 Ktor 阻塞主线程的示例。“状态”是指连接的客户端数量、文件下载进度、基于其答案的客户端状态。

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

标签: javakotlinserverktor

解决方案


相信您会对使用embeddedServer配置类型感兴趣。

创建服务器后,您需要调用startwhich 接受一个参数,该参数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()and server.start(false)(这是相同的,因为默认情况下,参数设置为 false 不会阻塞主线程,您可以与 Ktor 并排运行您的应用程序


推荐阅读