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

Posted

技术标签:

【中文标题】在单独的线程中初始化 Ktor 可以吗?【英文标题】:Is it OK to init Ktor in separate thread? 【发布时间】:2021-04-23 01:37:37 【问题描述】:

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

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

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

【问题讨论】:

您的意思是使用 Ktor 作为客户端还是服务器?我猜你的意思是服务器,在这种情况下,是的,没有什么能阻止你在单独的线程中运行它(就像你在 Java 中所做的那样)。但我不确定这是否是正确的举动。你能扩展你试图实现的目标吗?想要实现什么样的功能?您是在谈论 Java 应用程序还是 android 应用程序? > 创建具有服务器功能的桌面 JVM 应用程序在 LAN 上侦听移动客户端连接 那么我认为你可以简单地在单独的线程中启动 Ktor 是的。 【参考方案1】:

我相信您会对使用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 并排运行您的应用程序

【讨论】:

工作,但是在 Linux 上你会得到 java.net.SocketException: Permission denied for default config,需要将端口设置为 1000 以上。 也许您已经在端口 80 上运行了一些东西?就像来自 LAMPP 的 apache? 它们被称为特权 TCP 端口,您可以检查是否绑定端口低于 1024 (upd),如果端口已绑定,则会出现 java.net.BindException: Address already in use 还没有在 linux 上尝试过 Ktor,但在我的 Windows 机器上没有问题 :o

以上是关于在单独的线程中初始化 Ktor 可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 的 TADOConnection 线程安全吗?

如何在 Ktor 内部检查 Netty 是不是实际启动?

Android最佳实践:可以在主线程上初始化TextToSpeech引擎吗?

简单有趣的Kotlin异步微服务框架: 初始Ktor

简单有趣的Kotlin异步微服务框架: 初始Ktor

简单有趣的Kotlin异步微服务框架: 初始Ktor