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,去測試我的伺服器長連接配接是否正常。
結論是:websocket可以正常建立連接配接的。
- 端口檢測是否正常
最後檢查端口是不是異常了,指令(因為這邊開啟的端口是9090):
netstat -aln |grep 9090
結論是:端口木有問題
- 檢查代碼是否出錯
長連接配接建立的代碼,瞄一眼看看:
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