2019年9月10日java
這天部署服務器後,發現websocket 出現鏈接異常,這裏摘取部分重要log。python
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協議)。git
定位手段:
- 寫個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依賴的包都沒有安裝,從新去搭環境又費事費勁,因此決定另謀他路了。github
- cURL指令檢測
curl -i http://localhost:9090/interserver
curl是一個命令行工具,經過指定的URL來上傳或下載數據,並將數據展現出來。這裏我利用工具模擬了我這邊的長鏈接創建url,去測試個人服務器長鏈接是否正常。web
結論是:websocket能夠正常建立鏈接的。bash
- 端口檢測是否正常
最後檢查端口是否是異常了,指令(由於這邊開啓的端口是9090):服務器
netstat -aln |grep 9090
結論是:端口木有問題websocket
- 檢查代碼是否出錯
長鏈接創建的代碼,瞄一眼看看:eclipse
URI uri = new URI(String.format("ws://%s:%d/", border.getPrivateAddress(), border.getPrivatePort()));
結論是:果真代碼有改動,致使鏈接建立失敗!!curl
應該修改成:
URI uri = new URI(String.format("ws://%s:%d/interserver", border.getPrivateAddress(), border.getPrivatePort()));
教訓:
對於代碼的審覈要嚴謹,專一去思考邏輯,不然就會給本身帶來額外的工做量。
參考: