[英]Ktor MalformedInputException when connecting to Python websockets
我正在尝试组织 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
要使其正常工作,请安装WebSocket Deflate 扩展:
HttpClient(CIO) {
install(WebSockets) {
extensions {
install(WebSocketDeflateExtension) {
compressionLevel = Deflater.DEFAULT_COMPRESSION
compressIfBiggerThan(bytes = 4 * 1024)
}
}
}
}
并删除用于设置Sec-WebSocket-Extensions
header 的代码:
request = {
header("Sec-WebSocket-Extensions", "permessage-deflate")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.