天天看點

FAQ(88): The HTTP response from the server [404] did not permit the HTTP upgrade to WebSocket?log:原理:定位手段:教訓:

2019年9月10日

這天部署伺服器後,發現websocket 出現連接配接異常,這裡摘取部分重要log。

log:

java.util.concurrent.ExecutionException: javax.websocket.DeploymentException: The HTTP response from the server [404] did not permit the HTTP upgrade to WebSocket
Caused by: javax.websocket.DeploymentException: The HTTP response from the server [404] did not permit the HTTP upgrade to WebSocket
           

原理:

用戶端與伺服器端建立長連接配接之前,需要先通過HTTP建立連接配接,然後才将協定更新為websocket(本質上還是TCP協定)。

定位手段:

  • 寫個python腳本測試長連接配接
import websocket

url = 'wss://host:port/'  #websocket連接配接位址
ws = websocket.create_connection(url)
data = 'ping'
ws.send(data)
print(ws.recv())    #伺服器響應資料
ws.close()   #關閉連接配接
           

上面是一段python腳本,但是我後來發現單元環境很多py依賴的包都沒有安裝,重新去搭環境又費事費勁,是以決定另謀他路了。

  • cURL指令檢測
curl -i http://localhost:9090/interserver
           

curl是一個指令行工具,通過指定的URL來上傳或下載下傳資料,并将資料展示出來。這裡我利用工具模拟了我這邊的長連接配接建立url,去測試我的伺服器長連接配接是否正常。

FAQ(88): The HTTP response from the server [404] did not permit the HTTP upgrade to WebSocket?log:原理:定位手段:教訓:

結論是:websocket可以正常建立連接配接的。

  • 端口檢測是否正常

最後檢查端口是不是異常了,指令(因為這邊開啟的端口是9090):

netstat -aln |grep 9090
           
FAQ(88): The HTTP response from the server [404] did not permit the HTTP upgrade to WebSocket?log:原理:定位手段:教訓:

結論是:端口木有問題

  • 檢查代碼是否出錯

長連接配接建立的代碼,瞄一眼看看:

URI uri = new URI(String.format("ws://%s:%d/", border.getPrivateAddress(), border.getPrivatePort()));
           

結論是:果然代碼有改動,導緻連接配接建立失敗!!

應該修改為:

URI uri = new URI(String.format("ws://%s:%d/interserver", border.getPrivateAddress(), border.getPrivatePort()));
            
           

教訓:

對于代碼的稽核要嚴謹,專注去思考邏輯,否則就會給自己帶來額外的工作量。

參考:

https://github.com/eclipse/jetty.project/issues/3903

FAQ