Ошибка установки ktor websocket на устройстве Android - PullRequest
2 голосов
/ 06 августа 2020

Я пытаюсь запустить простой пример чата на устройстве Android с помощью ktor websocket, но он не работает. У меня ошибка при установке сервера websocket в MainActivity

Вот build.gradle для ktor websocket

//this is for project
ext.ktor_version = '1.2.5'
maven { url "https://dl.bintray.com/kotlin/ktor" }

//this is for app
 packagingOptions {
        exclude 'META-INF/*'
    }

    implementation "io.ktor:ktor-websockets:$ktor_version"

И вот код для MainActivity

import io.ktor.application.*
import io.ktor.features.*
import io.ktor.http.cio.websocket.*
import io.ktor.http.cio.websocket.CloseReason
import io.ktor.http.cio.websocket.Frame
import io.ktor.http.content.*
import io.ktor.routing.*
import io.ktor.sessions.*
import io.ktor.util.*
import io.ktor.websocket.*
import kotlinx.coroutines.channels.*
import java.time.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        install(WebSockets) {
            pingPeriod = Duration.ofSeconds(60) // Disabled (null) by default
            timeout = Duration.ofSeconds(15)
            maxFrameSize = Long.MAX_VALUE // Disabled (max value). The connection will be closed if surpassed this length.
            masking = false
        }
    }
}

Когда я построить этот код на Android Studio, возникла ошибка

public fun <P : Pipeline<*, ApplicationCall>, B : Any, F : Any> ???.install(feature: ApplicationFeature<???, WebSockets.WebSocketOptions, WebSockets>, configure: WebSockets.WebSocketOptions.() -> Unit = ...): WebSockets defined in io.ktor.application

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Websockets - одна из серверных функций , которые вы можете подключить к приложению, поэтому контекст для вызова install должен быть приложением Ktor, а не Android Activity. Рекомендую посмотреть пример Hello world . Вот ваш пример кода, измененный:

import io.ktor.application.*
import io.ktor.http.cio.websocket.*
import io.ktor.server.engine.*
import io.ktor.websocket.*
import java.time.Duration
import io.ktor.routing.*
import io.ktor.server.netty.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        embeddedServer(Netty, 4444) {
            install(WebSockets) {
                pingPeriod = Duration.ofSeconds(60) // Disabled (null) by default
                timeout = Duration.ofSeconds(15)
                maxFrameSize = Long.MAX_VALUE // Disabled (max value). The connection will be closed if surpassed this length.
                masking = false
            }
            routing {
                webSocket("/") {
                    // ...
                }
            }
        }.start()
    }
}

Вам необходимо добавить следующие зависимости, чтобы этот пример работал:

implementation "io.ktor:ktor-server-core:$ktor_version"
implementation "io.ktor:ktor-server-netty:$ktor_version"
implementation "ch.qos.logback:logback-classic:1.2.3" // for logging
0 голосов
/ 06 августа 2020

Не могли бы вы назвать используемую вашу текущую версию Kotlin и версию Gradle? Если версия Kotlin меньше 1.4, я бы посоветовал попытаться добавить -jvm или -android к именам зависимостей ktor в вашем build.gradle.

...