WebSocket: Expected HTTP 101 response but was ‘403 Forbidden‘

今天项目在执行websocket连接请求时报错:

securesms W/WebSocketConnection: onFailure()
    java.net.ProtocolException: Expected HTTP 101 response but was '403 Forbidden'
        at okhttp3.internal.ws.RealWebSocket.checkResponse(RealWebSocket.java:229)
        at okhttp3.internal.ws.RealWebSocket$2.onResponse(RealWebSocket.java:196)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:203)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)

因为websocket协议建立连接时有一次握手过程,握手时客户端使用的是http协议发送的请求,服务器正常会返回101,表示握手成功;但是如果服务器对客户端的请求做了校验后发现校验没有通过(比如校验客户端的证书)可能就会返回403,表示不允许该客户端建立连接。

项目中建立websocket连接前,必须先发送https请求登录,登录成功后发送https请求获取证书,然后携带着证书去向服务器建立websocket连接,此时websocket才会正常建立连接。

Http 101 状态码

Http 101 状态码英文名称是Switching Protocols,表示切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到Http的新版本协议。

服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。

只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的Http 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值