1. 程式人生 > >Indy TIdTCPClient 在網路掉線時的處理方法

Indy TIdTCPClient 在網路掉線時的處理方法

自己做 TCP 的操作,客戶端採用 TIdTCPClient 用起來比較簡單。經過測試,這個控制元件也比較穩定。Indy 的控制元件都是阻塞模式。阻塞模式下,程式碼比較簡單,不容易出現麵條程式碼。

假設 TCP 連線已經建立,正常操作中,網路掉線了,可能過一段時間,網路又恢復了。比如拔掉網線這種情況。

經過測試,發現以下狀況。以下描述的情況,在主執行緒中操作,和線上程中操作,結果一樣。


在剛掉線的在幾秒之內,傳送資料不會出異常。看起來就是傳送成功了(實際上肯定沒發出去,網路已經掉了)。此時,檢查其 Connected 屬性,也正常,返回 True。
一段時間後,再次傳送資料,會出現異常。此時檢查 Connected 屬性,也會出現異常。但這種情況下,IdTCPClient 不會自己掉線。此時就算網路恢復正常,它還是一直異常下去。

集中情況:1. 沒有建立連線;2. 已經建立連線;3. 已經建立連線但網路掉了,傳送資料或讀 Connected 屬性已經異常了。上述3鍾情況下,呼叫其 Disconnect 方法,都不會異常。

在第三種情況下,要想恢復,呼叫 Disconnect 方法,這時候檢測 Connected 屬性,不會異常,會返回 False。如果網路通了,這時候執行 Connect 會成功,連線重新建立。

因此,最簡單的做法是用 try...except...end 在 except 中執行 IdTCPClient.Disconnect 方法。

如果程式比較複雜,層次比較深,except 這裡最好 raise 再次把異常丟擲。這樣程式讀寫資料的地方,無需知道讀寫是否成功,異常則自然會中斷程式的執行。

相關推薦

Indy TIdTCPClient網路處理方法

自己做 TCP 的操作,客戶端採用 TIdTCPClient 用起來比較簡單。經過測試,這個控制元件也比較穩定。Indy 的控制元件都是阻塞模式。阻塞模式下,程式碼比較簡單,不容易出現麵條程式碼。 假設 TCP 連線已經建立,正常操作中,網路掉線了,可能過一段時間,網路又恢

Activity被回收之後的網路請求回撥處理方法詳解

想起寫這麼一篇博文的前提是上週去面試了一家公司,其中有這麼一個問題印象深刻,結合當時在網上看到的解決辦法我就說了一個錯誤答案,結果當場就被面試官給指出了錯誤,所以回來後和我的領導一起討論了這麼一個問題,他提出了一個很好地解決思路,於是乎我便寫了這麼一段程式

Cisco 1131AP問題處理

註冊、1131、WLC、CISCO前幾天用戶打來電話說是行政樓的無線網絡不好用了,所有AP都亮紅燈!很奇怪,因為前一天使用都正常,怎麽全部都不好用了呢?趕到用戶現場登錄WLC,發現WLC上了少了很多AP,而這些AP都是1131的,其它的型號的1142、1602都工作正常,難道真的都壞了?查看WLC日誌,看到日

360wifi: 手機鎖屏360wifi的解決方法

clas tex 有關 技術 img 安全性 content 出現 list 如遇到iphone鎖屏斷網的情況,按照以下操作步驟可以解決一部分用戶的問題 (該問題並不是360WifFi問題,與蘋果機制有關)如有安卓手機掉線,請確保手機連接其他Wifi並不會掉線,然後嘗試粉色

用技術解決困惑:解決校園網自動重啟問題

解決校園網掉線時自動重啟問題 在學校常常會遇到校園網狗血般經常性斷網,斷網原因多種多樣,有些是校園網技術落後,負載太多時故障性掉線,有些則是檢測到開啟wifi而主動掉線。 一、如何解決校園網斷網後自動重新啟動,並且重新開啟wifi? 以下為題主的解決方

【經驗】ADB的解決方法

1、殺掉adb adb kill-server // 殺掉adb 若“adb kill-server”執行成功,重新啟動adb即可 adb start-server // 啟動adb

vue+element+axios全域性loading增加target標籤處理方法

問題:    在axios的攔截器中配置全域性loading時。如果加上target屬性時。呼叫close方法關閉loading時。close方法將失效原因:    加上target標籤時候loading將不是一個單例。解決方式:let loadinginstance, lo

Putty連阿里雲CentOS7.3伺服器總是的解決方法

申請了阿里雲的伺服器,CentOS7.3的系統,經常出現一會就掉線,需要從新登入才行。找到如下解決方案,實驗下是否可行。 1. echo ¥TMOUT 如果顯示空白,表示沒有設定,等於使用預設值0, 一般情況下應該是不超時。如果大於0,可以在如/etc/profile之類檔

ubuntu14.04.1LTS 無線網絡卡rtl8192cu問題解決方法

ubuntu用了有半年了,臺式電腦在網上買了個usb無線網絡卡, win7系統支援良好,ubuntu總是過一段時間就自動掉線,以下是解決方法: 1. 首先,確定無線網絡卡的型號:我的無線網絡卡型號為 RTL8192CU。 2. 編譯生成8192cu.ko驅動模組 sudo

jvm出現OutOfMemoryError處理方法/jvm原理和優化參考

The heap stores all of the objects created by your java program.The heap's contents is monitored by the garbage collector,which frees me

模擬器除錯“”問題解決方法

在使用模擬器除錯過程中,有時候會發現,模擬器“掉線”了。 在Eclipse的DDMS下看不到device裝置了 使用adb devices命令也不能顯示,或者是device offline狀態 在Eclipse裡邊直接執行自己的Android程式提示如下 [2011-03-16 16:26:30 -

基於TCP的socket程式設計網路重連

基於TCP的socket程式設計 sockets(套接字)程式設計有三種,流式套接字(SOCK_STREAM),資料報套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基於TCP的socket程式設計是採用的流式套接字。 正在裝載資料… 在這個程式中,

[Xcode10 實際操作]八、網路與多執行緒-(18)PerformSelector訊息處理方法:由執行系統,負責去呼叫物件的指定方法

本文將演示PerformSelector訊息處理方法。在專案資料夾上點選滑鼠右鍵彈出檔案選單。【New File】->【Swift File】->【Next】->【Save As】:iOSApp.swift->【Create】現在開始編寫程式碼,建立Swift類【iOSApp.swif

1、connect方法會阻塞,請問有什麼方法可以避免其長時間阻塞? 答:最通常的方法最有效的是加定時器;也可以採用非阻塞模式。 2、網路中,如果客戶端突然掉線或者重啟,伺服器端怎麼樣才能立刻知道? 答

3.在子網 />答: 簡: 30表示的是網路號(network number)是30位,剩下2位中11是廣播(broadcast)地址,00是multicast地址,只有01和10可以作為host address。 詳: />代表的子網的網路號是30位,即網路號是 & =,此子網的地址空間

MySQL中sleep程過多的處理方法

rec 連接超時 服務 一行 client out char* mysql連接 測試 先說具體方法: 先在MySQL中操作 set global wait_timeout = 60; set global interactive_timeout = 60; 然後在配置

[總結]Perl在遇到Unicode字符文件名的各種處理方法

ref 路徑 進行 foreach quest error 對象 odi base 環境 XP/WIN7 Perl v5.16 編輯整理:523066680 常見的那些文件操作函數都不支持,於是為了達到目的,需要各種方法配合,應該是不如其他語言方便。 我只是想看

JSON後臺處理特殊字符方法,在JSONArray.fromObject轉換處理

替換 ces return class 雙引號 string sonar substring log /** * 替換一個字符串中的某些指定字符 * @param strData String 原始字符串 * @param regex String 要替換的字符串 * @

文本溢出顯示省略號,CSS未加載a標簽仍可用處理方法

結合 on() 模型 多行 方案 ott bold -o 範圍 一、文本溢出打點 (1)單行文本 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; (2)多行文本 overflow : hid

Cuda中當數組數大於程數的處理方法

tde emc -c com -i str delet different target 參考stackoverflow一篇帖子的處理方法:https://stackoverflow.com/questions/26913683/different-way-to-index

使用BeautifulSoup讀取網頁發生錯誤的處理方法

剛開始學習BeautifulSoup在讀取網頁後解析網頁內容時發生錯誤,先上一段執行程式碼: #!/usr/bin/python # -*- coding: UTF-8 -*- from bs4 import BeautifulSoup from urllib2 import urlopen