遇到這個問題不要慌,去查查眾說紛紜。那我就在這里總結一下吧
存在此問題的有以下幾種情況
1、ws連接不穩定經常斷線;
答:
1)可能是客戶和服務器之間的網絡問題
2)可能是服務端內存不夠用導致線程被異常清理
2、ws連接成功后過一點時間后就自動斷開
答:
1)一般情況下是nginx轉發或者 tomcat的連接超時導致容器層主動關閉這個連接
(1)修改容器層tomcat或者nginx【proxy_read_timeout 5000s; keepalive_timeout 5000s;】配置即可,但是治標不治本不推薦
(2)服務端主動向客戶端發送心跳消息的發送,不推薦,因為會導致服務端負荷
(3)客戶端主動向服務端發送心跳消息,我個人情況下比較推薦這種方案
3、ws連接之后服務端由於鑒權失敗等各種原因服務器主動關閉連接導致拋出該異常
答:解決代碼在下面【重點在於CloseReason.CloseCodes.TLS_HANDSHAKE_FAILURE錯誤碼,當你使用這個錯誤碼會導致io錯誤,意思是握手失敗】
/**
* 操作進行下線
* @param session
*/
public void optClose(Session session){
// 判斷當前連接是否還在線
if (session.isOpen()){
try {
// 關閉連接
CloseReason closeReason = new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE,"鑒權失敗!");
session.close(closeReason);
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:當發生異常錯誤時,應該及時關閉連接並且處理相關用戶的上下線操作!
