轉載請注明出處:http://www.cnblogs.com/Joanna-Yan/p/7942323.html
在使用Netty進行WebSocket開發時,測試發現:ie 11系列個別低版本連接WebSocket后立即自動斷開了連接。如,ie 11.0.38。
1.調試
后台日志打印:
WebSocket handlerAdded handlerAdded---WS管道標識:00000000000000e0-00002520-0000001b-e9a4ab6f2de6f7bb-aa79b5c5 WebSocket channelActive WebSocket channelRead0 WebSocket channelReadComplete WebSocket channelInactive WebSocket handlerRemoved handlerRemoved---WS管道標識:00000000000000e0-00002520-0000001b-e9a4ab6f2de6f7bb-aa79b5c5 WebSocket handlerAdded handlerAdded---WS管道標識:00000000000000e0-00002520-0000001c-c5d7cd14ade6fbc9-50bf51ea WebSocket channelActive WebSocket channelRead0 WebSocket channelReadComplete WebSocket channelInactive WebSocket handlerRemoved handlerRemoved---WS管道標識:00000000000000e0-00002520-0000001c-c5d7cd14ade6fbc9-50bf51ea
發現,WebSocket客戶端連接服務器后,立即觸發了斷開事件,是什么原因呢?
debug,問題鎖定代碼塊:
2.思考
在判斷是否可升級成WebSocket協議時,發現該Http協議無法升級成ws協議,從而返回異常。
難道該ie版本不支持WebSocket?換成javaee-api-7.0.jar或者tomcat自帶的websocket包測試都通過,所以確定該版本還是兼容WebSocket的。
目前各瀏覽器支持的WebSocket版本和服務器netty的WebSocket版本都是13。到底是什么原因呢?
在不同瀏覽器下測試看看,打印:req.getDecoderResult().isSuccess()和req.headers().get("Upgrade")的值到底是什么。!!!
3.解決
測試結果:
用其他瀏覽器測試,打印結果都是:true;websocket
唯獨用ie 11系列個別版本測試,打印的結果是:true;Websocket
讓人很無語的發現,其中Websocket的W是大寫的。為什么ie 11系列里面有的版本是跟主流瀏覽器一樣是websocket,個別低版本卻是Websocket。
這應該就是跟ie11系列各種問題,所以才出了那么多版本的問題吧。
當然,解決問題的方法顯而易見了。將equals該為equalsIgnoreCase。
后面會將WebSocket系列和Netty系列補上,有興趣的可關注。
如果此文對您有幫助,微信打賞我一下吧~