Ktor Android客户端WebSocket连接失败报IllegalStateException如何解决?
问题根因
该报错是Ktor CIO引擎发送WebSocket握手请求时,默认请求头没有匹配目标测试服务的传输规则要求:WebSocket握手为无请求体的GET请求,但目标服务要求必须明确声明无请求体的传输规则,要么指定Content-Length为0,要么开启分块传输,要么禁用长连接。
可行解决方案
方案1:禁用keep-alive+指定请求体长度
直接在HttpClient配置中添加对应请求头即可适配服务端规则,修改后的代码如下:
val client = HttpClient(CIO) { install(WebSockets) // 配置默认请求头匹配服务端要求 defaultRequest { header("Connection", "close") // 禁用keep-alive header("Content-Length", 0) // 明确指定请求体长度为0 } } GlobalScope.launch { client.webSocket("ws://82.157.123.54:9010/ajaxchattest") { // 此处添加WebSocket交互逻辑 } }
方案2:更换客户端引擎规避兼容性问题
如果方案1不生效,大概率是CIO引擎本身对自定义规则的WebSocket服务兼容性不足,可以更换为OkHttp引擎规避底层配置问题,操作如下:
- 先添加OkHttp引擎依赖(Gradle配置示例):
implementation "io.ktor:ktor-client-okhttp:你的Ktor版本号"
- 修改客户端初始化代码:
val client = HttpClient(OkHttp) { install(WebSockets) } GlobalScope.launch { client.webSocket("ws://82.157.123.54:9010/ajaxchattest") {} }
额外提示
- 生产环境不要使用
GlobalScope,建议绑定和业务生命周期匹配的自定义协程作用域 - 目标测试服务有连接频率限制,调试时不要短时间内频繁发起连接避免被临时屏蔽
内容的提问来源于stack exchange,提问作者user16799920
相关产品推荐
相关产品推荐

