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

TServerSocket 的UDP 模式

答題得分者是:暗黑破壞神
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-20 16:55:56 IP:61.67.xxx.xxx 未訂閱
請問各位!

剛才已爬過站上文章,TServerSocket 的模式使用TCP會容易造成被意外中斷踢離的現象,因此建議使用 UDP 是比較穩定,但我查看 TServerScoket 的資料,好像找不到可以指定UDP模式的設定,不知要如何設定才能將原本走TCP的架構變成UDP,謝謝!
編輯記錄
P.D. 重新編輯於 2007-06-20 16:56:55, 註解 無‧
暗黑破壞神
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-20 19:41:14 IP:220.131.xxx.xxx 未訂閱
TServerSocket 本來就是 TCP 的東西。
UDP 的東西以 BCB 5.0 來說它在 FastNet 裏的 UDP 元件。

是說。TCP 會被踢掉。 UDP 不會。這是什麼論點?
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-20 21:39:24 IP:61.67.xxx.xxx 未訂閱
嗯,應該這麼說,我用TServerSocket及TClientSocket做了一個互相傳送一個重要訊息的介面來控制遠端的 RS-232,但常發生在一兩個小時的TClientSocket.Active:= True 下如果沒有任何傳送的話,當突然再次由Client送給Server訊號時,會出現 Socket Error 的連線錯誤,只要重新Active=False, 再True又可以正常通訊,其實這個狀況在InterBase利用TCP/IP直接連線時,也會有這個現象,所以InterBase我都是利用定時30分鐘再主動回探主機,才不會造成長時間閒置而斷線,而剛才的爬文中有幾位前輩提到要避免這樣的情況,建議改用UDP模式會比較穩定,不知這樣的論述是否正確?
編輯記錄
P.D. 重新編輯於 2007-06-20 21:41:36, 註解 無‧
暗黑破壞神
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-20 22:39:45 IP:220.131.xxx.xxx 未訂閱
應該不是那樣說。我記得 TCP 裏面有個  keep alive 的東西存在。
如果過久沒封包傳送會把你踢掉。不過可以設這個東西讓它幫你處理這個。
不然你也應該在 server 端對 client 端做 ping/pong 的動作。以確保你
client connect 數的正確。
因為 client disconnect 可能不是正常離線時。 server 不見得會立刻反應過來。
可以藉由這種手法來確保。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-21 00:49:22 IP:61.67.xxx.xxx 未訂閱
感謝指導,這方面我還是很弱,目前我是改用 IDUDPserver, IDUDPclient 來做,好像比較簡單點,有關TCP的部份我會再花一些時間去研究一下,謝謝!
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-03 23:18:49 IP:202.105.xxx.xxx 訂閱

1. UDP 不能保证你发送的包一定会被对方收到。如果你要保证,就要自己写代码。TCP 是保证的。
2. 使用 IdUdpServer 你必须注意一个问题,就是如果你在 IdUdpServer 的 On...(不好意思,不记得了)那个事件里写代码获取对方送来的数据然后处理数据的话,要尽量快完成。这一点,Indy 的 help 里有说明的。但它没有说明理由。其实,原因是那个 OnRead (好像是这个吧?)是 IdUDPServer 内部的 Thread 触发的,它输出的来自网络的数据是一个 TStream,这个 TStream 也是它在管理。如果你在这个事件里取得数据后,处理数据的代码非常复杂,占用大量的时间(比如你去连接数据库,然后从数据库读一大堆的数据出来,要花100秒才能执行结束),那么,IndyUDP 就没有办法继续处理来自网络的其它数据。这是我使用 Indy UDP Server 的心得。

那么,上述问题该如何解决?

简单的办法,就是搞一个缓冲区,把数据从 TStream 里读出来,放到新的数据对象里去,最简单的就是放到一个 String 里面,然后把 String 放到一个 StringList 里面。然后,另外一个 Thread 再从这个 StringList 里面把每条 String 取出来处理。这个 thread 处理100秒,也和 IdUDPServer 没有关系了。


===================引 用 P.D. 文 章===================
感謝指導,這方面我還是很弱,目前我是改用 IDUDPserver, IDUDPclient 來做,好像比較簡單點,有關TCP的部份我會再花一些時間去研究一下,謝謝!
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-07-12 16:09:23 IP:61.30.xxx.xxx 訂閱
敢問 P.D 版大 再開發什麼程式?
我之前也有接過類似的案子,只是後來沒談成!!
控制IE要能發送(接收)UDP之類的!!
------
======================
昏睡~
不昏睡~
不由昏睡~
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-05 17:02:04 IP:61.67.xxx.xxx 未訂閱
我主要是要解決Terminal Server 與 Client 之間的週邊控制問題,由於Windows的Terminal Server 對支援Printer, usb, rs-232 都很不理想,所以我才會透過tcp, udp 方式將資料由 Terminal Server 傳回 Client 來運作
===================引 用 ko 文 章===================
敢問 P.D 版大 再開發什麼程式?
我之前也有接過類似的案子,只是後來沒談成!!
控制IE要能發送(接收)UDP之類的!!
系統時間:2024-05-02 9:27:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!