在单独的线程中初始化 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 线程安全吗?