線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3003
推到 Plurk!
推到 Facebook!

ClientSocket的問題

缺席
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-12 09:24:28 IP:203.79.xxx.xxx 訂閱
各位先進,請教一個問題,不知道有沒有人碰過

我在 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-14 11:05:11 IP:61.67.xxx.xxx 未訂閱
一般來說 , SocketClient 的做法是 connect上後, 把要傳送的資訊送到 SocketServer上接收後, 就做 disconnect 的動作, 當下次要再次連線, 再進行  connect , 我這樣的操作, 在客戶上開一整天是不曾遇到你提到的問題, 而SocketServer是永遠保持在Listen 的狀態下
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-14 11:30:13 IP:203.79.xxx.xxx 訂閱
版主大大說的沒錯,我的狀況也是一樣,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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-14 21:35:03 IP:61.67.xxx.xxx 未訂閱
你要不要先試試看把SocketServer保持在Listen 下, 不斷的CONNECT 下, 是否會有這個問題, 如果正常的話, 再朝向LISTEN的動作去查, 反之 那就與SocketServer有沒有一直持續沒有關係了, 要再往其他地方去查!
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-05-15 14:24:42 IP:203.79.xxx.xxx 訂閱
版主大大

這我平常就有試過,只要是 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-05-15 15:15:20 IP:60.250.xxx.xxx 訂閱
Hello
ClientType 設成 ctBlocking 看看
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-05-15 15:20:13, 註解 無‧
AndrewK 重新編輯於 2009-05-15 15:20:23, 註解 無‧
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-05-15 15:42:15 IP:203.79.xxx.xxx 訂閱
AndrewK 大大,我會試一下,但能先請教一下,原理是什麼嗎?



===================引 用 AndrewK 文 章===================
Hello
ClientType 設成 ctBlocking 看看
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-05-15 16:58:25 IP:60.250.xxx.xxx 訂閱
我有看過類似的案例
一樣是使用 ClientSocket 發生問題,server 無法回應
他的解決方式是
Set ClientType to ctBlocking
在傳輸資料上就沒問題了

以下為官方 Help 說明
Description
Set ClientType to ctNonBlocking to enable the client socket to respond to asynchronous reading and writing events. When ClientType is ctNonBlocking, execution is not blocked by reading and writing over the socket connection. OnRead or OnWrite events occur when the socket needs to read or write over the connection.

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 TWinSocketStream object for reading and writing. TWinSocketStream prevents the application from hanging indefinitely if a problem occurs while reading or writing. It also can wait for the socket connection to indicate its readiness for reading.

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
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-05-15 17:01:02, 註解 無‧
AndrewK 重新編輯於 2009-05-15 17:04:14, 註解 無‧
AndrewK 重新編輯於 2009-05-15 17:06:06, 註解 無‧
AndrewK 重新編輯於 2009-05-22 17:07:37, 註解 無‧
AndrewK 重新編輯於 2009-05-22 17:08:04, 註解 無‧
AndrewK 重新編輯於 2009-05-22 17:12:11, 註解 無‧
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-05-22 14:28:27 IP:203.79.xxx.xxx 訂閱
Andrew 大大,我試了還是不行。

決定放棄了,就每次再去Create Socket Instance 好了。

還是感謝您....


===================引 用 AndrewK 文 章===================
Hello
ClientType 設成 ctBlocking 看看
系統時間:2024-04-25 17:59:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!