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

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

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

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

【问题讨论】:

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

标签: java kotlin server 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
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多