FAQ(88): The HTTP response from the server [404] did not permit the HTTP upgrade to WebSocket?

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()));

教訓:

對於代碼的審覈要嚴謹,專一去思考邏輯,不然就會給本身帶來額外的工做量。

 

參考:

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

相關文章
相關標籤/搜索