大概流程是這樣的:
web前端用戶登錄----》后臺<<-- 一個執行緒持續發送心跳包和接收資料 保持socket TCP長連接-->>服務端
web前端用戶退出----》后臺<<-----斷開連接,結束執行緒----->>服務端
問題:
我用一個用戶測驗的時候,沒問題。登錄成功,接發資料成功。退出也OK。
但是當兩個用戶比如A,B都登錄保持通訊的情況下,如果A用戶退出,導致B用戶通訊失敗。看錯誤資訊socket is close。
請問:
請幫忙分析會是什么原因導致這樣的情況,謝謝。
補充:
用戶退出后臺處理流程:
發送退出資料包給服務端,然后結束執行緒,加入了一個是否退出的標識(issysout)
public class TxThread extends Thread {
while(true){
if(issysout){
System.out.println("用戶退出,退出心跳,退出執行緒");
return;
}
}
請問是不是這個退出標識出的問題? 按照我的理解,一個登錄用戶一個執行緒,自己執行緒的結束應該不會影響其他用戶。
uj5u.com熱心網友回復:
看起來有點像,一個連接關閉,將所有連接,或者服務端關閉了。你檢查下,是不是有共用的服務端連接關閉動作,被觸發了。
uj5u.com熱心網友回復:
你的服務器端是怎么創建socket的?不會是共用了同一個socket吧?你的issysout是執行緒自己的屬性嗎?還是服務器端的一個共有變數?
uj5u.com熱心網友回復:
issysout就是一個變數。
socket = new Socket(host, port); //其他地方都呼叫這個socket
服務端是別人的程式,沒法修改。
現在測驗發現
比如A先登錄 (192.168.10.111,1088)
B用戶后登錄,(192.168.10.111,1089)
然后A用戶退出,結果發現是B用戶被退出了。
然后我列印了下 System.out.println("發送socket地址:"+socket);
Socket[addr=/192.168.10.111,port=1088,localport=54893] socket資訊是B用戶的。
也就是說呼叫的是最后登錄用戶的socket。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/78954.html
標籤:Web 開發
