下面是我新建的一個socket、連接然后每隔10秒給服務端發送心跳資料

下圖是服務端那邊因主動或者例外關閉之后,我這邊還繼續發送了心跳資料而產生的例外。不知道如何解決因例外斷開之后,如何重啟這個socket問題,又沒有會的大神幫小弟解決,在線等,謝謝了!
uj5u.com熱心網友回復:
需求是什么,服務器斷開以后,你想怎么處理?可以在檢測到例外斷開以后不斷重新嘗試連接,也可以直接close這個socket,這取決于你的業務。
uj5u.com熱心網友回復:
這位大哥,你說的兩種方法確實是兩種需求(我兩種需求都可行),但是我的問題是socket,close掉之后,我在重新new一個通信客戶端類會出現socket已經關閉的例外。不斷重新嘗試連接會出現我那個IO流通道中的例外,是通信已經斷開了,我沒有及時監測到還在往服務端發送東西,就會出現問題。這是困擾我的問題,并不是需求問題,這兩個放法我都試過,就是沒能解決這個問題uj5u.com熱心網友回復:
socket物件沒有必要復用,每次new client的時候,不用判斷if(socket==null),直接new一個socket出來。uj5u.com熱心網友回復:

我不清楚那個socket斷開之后,為什么getlocal還是原來的那個通信?
我嘗試過close,也嘗試過socket=null,但是debug看程式的時候不管例外端還是我close,get出來的都是第一次建立的那個連接,不讓我重新new。這點我是不能理解,麻煩幫我解釋下,謝謝
uj5u.com熱心網友回復:
直接放圖你是想讓別人幫你把所有代碼再敲一遍嗎?還是截圖,保存,修改,再上傳?try里,第一句去掉,外層的if判斷也去掉,直接跑if里面的代碼就行。原來的代碼只有在new threadConnect物件的時候才會new socket,斷開重連的時候,先會獲取threadConnect物件的socket,這個socket哪怕斷開,仍然是一個存在的物件,永遠不會等于null,所以if里的new socket永遠不會執行。
手工設定socket=null也可以,但是正確方法應該是threadConnect.set(null)(前提是set方法不對傳入的引數做null判斷),而不是socket = null。
uj5u.com熱心網友回復:
謝謝了,我只是了解一個思路的,不用麻煩你坐其他的。我先用你這個思路做一下看看uj5u.com熱心網友回復:
樓主弄出來沒?讓咱也參考下下...uj5u.com熱心網友回復:
成改好了。就是做個簡單的改動,可以看下事例代碼public FullDuplexClientDemo(String ip) {
try {
// socket = threadConnect.get();
// if (socket == null) {
socket = new Socket(ip,Integer.valueOf(ConfigUtils.properties.getProperty("CRScannerPort")));
// threadConnect.set(socket);
if (tKeep.isAlive() == false && tRecv.isAlive() == false ) {
tKeep.start();
tRecv.start();
}
// }
outStr = socket.getOutputStream();
inStr = socket.getInputStream();
islive = true;
} catch (Exception e) {
e.printStackTrace();
new WarningDialog(MessageResource.getMessage("MainFrame.TabbedPane.Error", Language.getLocale())+"-Err1007");
socket= null;
}
uj5u.com熱心網友回復:
樓主,在Android中,徹底關閉應用后,心跳連接還存在,怎么斷開啊?uj5u.com熱心網友回復:
keepThread和recvThread這兩個類怎么實作的轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/108221.html
標籤:網絡通信
