全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3365
推到 Plurk!
推到 Facebook!

如何防止網絡通訊失去連繫

答題得分者是:暗黑破壞神
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-29 18:59:42 IP:58.152.xxx.xxx 訂閱
我寫了一個網絡通訊程序,分別使用了ClientSocket和SserverSocket控件.
ClientSocket用在遠程機子端,隔時嘗試連接在我的機子的ServerSocket.

procedure TForm1.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ErrorCode:=0;
socket.Close; //遇異常時即斷開連接並Enable TryConnectTimer重新嘗試連接
end;

procedure TForm1.ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
CheckTimer.Enable:=false; //停止Telnet遠程主機
TryConnectTimer.Enable:=true; //每隔10秒嘗試連接ServerSocket
end;

procedure TForm1.CheckTimer(Sender: TObject);
begin //在連接成功我用了一個Timer,每10分鐘Telnet一下遠程主機的1234端口
try
idtelnet1.Host:='host.com';
idtelnet1.Port:=1234;
idtelnet1.Connect;
except
ClientSocket.Socket.Close; //連接不到Client端則斷開連接並重新嘗試連接
end;
end;

上述代碼的作用都是防止程序在連接成功後遇異常而失去聯繫,但有時候Client端不知何故(不是關機或被用戶Terminate)還是失去了連繫,請問有沒有更可靠的方法解決此問題?
使用線程嗎?但在線程中去執行上面提到的CheckTimer,其作用是否一樣呢?
boson
中階會員


發表:74
回覆:155
積分:85
註冊:2004-07-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-30 17:23:39 IP:218.170.xxx.xxx 訂閱
依據我的經驗, TCP 難以保持長時間的連線狀態, 即使是在區域網路也是一樣,
偶而會有不明原因的斷線, 甚至斷線後再也無法重新連線,
之前開發程式遇過這樣的問題, 使我再也不敢信任 TCP 協定,
因此往後我寫的網路通訊程式, 我都寧可多花幾倍的工夫用 UDP 協定來寫,
雖然累, 但不會發生無法通訊的情況

之前也在這裏看過其他人有類似的不明原因斷線的情況, 似乎也都找不出原因,
因此, 建議你, 如果程式要長時間通訊, 還是使用 UDP 比較保險(當然你要付出的時間與精力就多得多了)

希望能有人知道如果保持 TCP 穩定連線的方法, 這樣大家寫通訊程式就輕鬆多了
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-30 17:41:48 IP:211.75.xxx.xxx 未訂閱
建議如果你要工作時才連線, 工作做完請離線, 這樣就不用考慮 TCP 或 UDP 的問題了
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
boson
中階會員


發表:74
回覆:155
積分:85
註冊:2004-07-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-01 09:09:29 IP:221.120.xxx.xxx 訂閱
當然, 如果工作只是短時間連線, 通訊完就沒事了, 那麼使用 TCP 也就無所謂,
短暫通訊結束, 就斷線了

問題在於, 如果通訊必須保持長時間連線, 長時間一直不斷進行傳輸,
那麼我的建議是改用 UDP, 因為 TCP 真的難以保持長時間連線,
我也曾試過每隔幾分鐘斷線重連, 但一樣會偶而發生不明原因斷線的情況,
甚至有時斷線後, 除非重開機, 否則無法再連線

總之, 需要長時間連線的話, 還是使用 UDP 才做得到
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-01 15:30:32 IP:219.79.xxx.xxx 訂閱
我的這一程序用隔時Telnet一下對方主機,掉線的情況倒不是經常出現,試過在保持連線1小時而沒有進行任何通訊的狀態後仍然正常運作(期間沒有斷線後自動連接的動作),反而是正在使用程序進行通訊時突然失去連繫,無法自動連接,而這一情況並不是在某一特定的操作時才會發生,所以找不到原因.
我是想問如果新建一專門監視連線狀態的線程會否比使用Timer可靠些?
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-01 19:27:06 IP:220.131.xxx.xxx 未訂閱
網路,本來就無法保證你的資料一定送到。
UDP也沒保證。
TCP只保證在連線狀況下,資料送達一定是正確的。

你的問題就像著名的兩軍對抗。
在兩山頭的將軍都想要對山谷的敵軍發出最後一擊。
可是只有一個山頭的兵力攻打,一定會輸。
所以必須要派通訊兵到另一個山頭說好時間。
可是通訊兵可能在出去時就被幹掉了。
也可能是到另一個山頭達成協議後被幹掉。

可是又有另一個問題。甲山頭派出通訊兵。他固然不知道乙是否知道這件事。
等到他的通訊兵回來時。他可以確知乙將軍已經知道了。
但是。乙山頭的將軍是不是該要煩惱,這個通訊兵,是不是有平安的回到甲山頭跟甲將軍說。我同意進攻呢?
乙又該如何知道呢?

通訊本來就是這麼一回事,網路通訊就是會有這些個鳥事。
如果不會有這種事。那就不用人了。
當年看作業系統的書。上面就說了。
當硬體出問題時,系統要解決。
當系統出問題時,應用程式要解決。
當應用程式出問題時,要誰解決?
當然就是人要解決。一層一層往上報。
否則檔案無法存檔,不跟你回報一直傻傻的幹嗎?
所以才會有著名的”請洽程式設計人員”這種話。
網路出問題。是不是要再繼續進行通訊。就得靠人來處理了。
而不是靠演算法來解決了。

硬體出問題。那就要靠看門狗,做什麼事呢?一個RESET天下無大事。^_^
系統時間:2024-05-04 23:49:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!