【问题标题】:Ktor MalformedInputException when connecting to Python websockets连接到 Python websockets 时出现 Ktor MalformedInputException
【发布时间】:2021-08-23 10:58:34
【问题描述】:

我正在尝试组织 python 服务器和 kotlin 客户端之间的 websocket 连接。作为 websockets 库,我使用 websockets 和 ktor。我写了两个简单的测试应用程序。因此,当我尝试从服务器获取响应文本时,我得到了 MalformedInputException。由于调试过程,我使用 Node js 编写了简单的 websocket 服务器,它工作正常。 我想我的编码有问题,但不知道如何解决。

Python 服务器

import asyncio
import websockets
from websockets import WebSocketServerProtocol

class Server:

    async def __respond(self, client: WebSocketServerProtocol, message: str):
        print(message)
        await client.send(message)

    async def ws_handler(self, client: WebSocketServerProtocol, uri: str) -> None:
        async for message in client:
            await self.__respond(client, message)

server = Server()
start_server = websockets.serve(server.ws_handler, '127.0.0.1', 4000)
loop = asyncio.get_event_loop()
loop.run_until_complete(start_server)
loop.run_forever()

Kotlin 客户端

client.ws(
            method = HttpMethod.Get,
            host = "127.0.0.1",
            port = 4000,
            path = "/ws",
            request = {
                header("Sec-WebSocket-Extensions", "permessage-deflate")
            }
        ) {
            send(Frame.Text("message"))

            for (frame in incoming) {
                when (frame) {
                    is Frame.Text -> println(frame.readText())
                    is Frame.Binary -> println(String(frame.readBytes(), StandardCharsets.UTF_8))
                    else -> println("error")
                }
            }
        }

Kotlin 堆栈跟踪

io.ktor.utils.io.charsets.MalformedInputException: Input length = 1
    at io.ktor.utils.io.charsets.CharsetJVMKt.throwExceptionWrapped(CharsetJVM.kt:325)
    at io.ktor.utils.io.charsets.CharsetJVMKt.decode(CharsetJVM.kt:199)
    at io.ktor.utils.io.charsets.EncodingKt.decode(Encoding.kt:103)
    at io.ktor.utils.io.charsets.EncodingKt.decode$default(Encoding.kt:101)
    at io.ktor.http.cio.websocket.FrameCommonKt.readText(FrameCommon.kt:146)
    at com.veronica.service.Client$run$3.invokeSuspend(Client.kt:33)

在“is Frame.Text -> println(frame.readText())”行抛出异常

Ktor 版本是 1.6.0

【问题讨论】:

    标签: python kotlin websocket ktor


    【解决方案1】:

    要使其正常工作,请安装 WebSocket Deflate extension:

    HttpClient(CIO) {
        install(WebSockets) {
            extensions {
                install(WebSocketDeflateExtension) {
                    compressionLevel = Deflater.DEFAULT_COMPRESSION
                    compressIfBiggerThan(bytes = 4 * 1024)
                }
            }
        }
    }
    

    并删除设置Sec-WebSocket-Extensions标头的代码:

    request = {
        header("Sec-WebSocket-Extensions", "permessage-deflate")
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多