TServerSocket 的UDP 模式 |
答題得分者是:暗黑破壞神
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
嗯,應該這麼說,我用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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我主要是要解決Terminal Server 與 Client 之間的週邊控制問題,由於Windows的Terminal Server 對支援Printer, usb, rs-232 都很不理想,所以我才會透過tcp, udp 方式將資料由 Terminal Server 傳回 Client 來運作
===================引 用 ko 文 章=================== 敢問 P.D 版大 再開發什麼程式? 我之前也有接過類似的案子,只是後來沒談成!! 控制IE要能發送(接收)UDP之類的!! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |