ClientSocket的問題 |
缺席
|
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
各位先進,請教一個問題,不知道有沒有人碰過
我在 Form 上面拉了一個 ClientSocket1 ,然後用 ClientSocket1 去連另一台電腦的 ServerSocket。 當 onConnect 時,就送一個字串到 ServerSocket 去。但ServerSocket並不是 always 是 online 的。所以ClientSocket在try 個10秒後,沒有連線就會放棄。 起初運作都正常,但跑了一兩個小時後,CleintSocket1 還是會去做 Connect 的動作,但是卻不會觸發 onConnect這個事件,甚至 onError 也沒有觸發到。 就好像 ClientSocket 整個運作都不正常,也不 Connect ,也沒有 Error 。 但我程式關閉後再開啟,就又正常了。 找了很久都找不到問題,後來火大就在每次要連線之前才 Create ClientSocket Instance,然後才去做連線,連完之後就 Free 掉。 這樣運作就正常了。可是我還是百思不得其解。為啥擺一個 ClientSocket 在 Form上面,跑久了就會不動作,是Delphi 元件的bug嗎?還是我有什麼東西沒注意到。 編輯記錄
carstyc 重新編輯於 2009-05-12 14:23:28, 註解 無‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
版主大大說的沒錯,我的狀況也是一樣,ClientSocket 連線處理完後就會 Disconnect。
唯一不同點是,我的 ServerSocket 不一定always是在 Listen。 所以 ClientSocket 在Connect 時,會有Connect 不到ServerSocket的現象。 但也就是這樣,連續Connect ServerSocket 不到,一兩個小時後,ClientSocket就罷工了。 ===================引 用 P.D. 文 章=================== 一般來說 , SocketClient 的做法是 connect上後, 把要傳送的資訊送到 SocketServer上接收後, 就做 disconnect 的動作, 當下次要再次連線, 再進行 connect , 我這樣的操作, 在客戶上開一整天是不曾遇到你提到的問題, 而SocketServer是永遠保持在Listen 的狀態下
編輯記錄
carstyc 重新編輯於 2009-05-14 11:31:35, 註解 無‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
版主大大
這我平常就有試過,只要是 Server Socket Online 時,ClientSocket就沒有問題...跑多久都可以正常work。 現在的問題是...如果Server Socket 離線一段時間後,當 Server Socket又活回來時,Client Socket 運作就不正常了。 ===================引 用 P.D. 文 章=================== 你要不要先試試看把SocketServer保持在Listen 下, 不斷的CONNECT 下, 是否會有這個問題, 如果正常的話, 再朝向LISTEN的動作去查, 反之 那就與SocketServer有沒有一直持續沒有關係了, 要再往其他地方去查! |
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
Hello
ClientType 設成 ctBlocking 看看
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。 |
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
|
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
我有看過類似的案例
一樣是使用 ClientSocket 發生問題,server 無法回應 他的解決方式是 Set ClientType to ctBlocking 在傳輸資料上就沒問題了 以下為官方 Help 說明 Description Set ClientType to ctBlocking to force all reading and writing to occur synchronously.It is a good idea to include the client socket object in a thread if the ClientType is ctBlocking, so that I/O does not block all execution within the client application. When ClientType is ctBlocking, use a Use a non-blocking socket when the socket needs to synchronize reading and writing with server sockets. 而 官方 Help 是建議 1.當clientype 為 ctNonBlocking 時,對於讀取、寫入方式是採非同歩方式 2.當使用執行緒時,建議採用 ctBlocking,其讀取、寫入方式是採同歩方式,其 讀取、寫入方式不會因錯誤而被鎖死,讀取、寫入資料建議使用TWinSocketStream object ,保證應用程式的穩定性 (也許怕執行緒和Tclientsocket 打架,或保證資料傳輸的完整....etc...) 3.執行緒本身也是可以設定同歩與非同歩,這方面的設定你也可以參加看看,我想 help 的建議,應該是擔心 在執行緒非同歩的情況下,clientsocket 同樣採用非同歩的話,會有不可預期的錯誤發生 結論為用ctBlocking 是比較穩定的,效率上的差別,就要靠您的驗證啦~~ 您可以看看您是否有使用執行緒,在可以測試的環境下,先按照 help 的說法,看看是不是能解決你的問題 我本身沒遇過您所說的問題,用TClientSocket 的經驗不多,如上所說有誤,看到的前輩煩請指正囉~~ =======引 用 carstyc 文 章=================== AndrewK 大大,我會試一下,但能先請教一下,原理是什麼嗎? ===================引 用 AndrewK 文 章=================== Hello ClientType 設成 ctBlocking 看看
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。 |
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |