Indy 如何達成多點傳送的功能 |
答題得分者是:暗黑破壞神
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位!
我在設計一支程式, 當程式資料庫有異動時, 以 TIdTcpClient 發 mesasge 到外面(註)電腦給 TidTcpServer接收, 當這些電腦收到這支程式的broadcast之後, 主動reflash database, 同時在畫面上進行更新顯示 現在有個問題 各電腦必須起 TidTcpServer, 每一個Server要有一個Port做waiting, 好讓 TIdTcpClient 可以經由這個port傳送消息, 但現在的狀況是 假設:這家公司在台北, 台中有分公司, 分公司內有10台電腦都要接這支程式, 每一台電腦都要一個Port, 而電腦又是躲在IP分享器後面, 換句話說, 台北總公司要連線這10台電腦, 就必須在台中的分享器把10組PORT都透通, 否則一定會被攔下來, 但一般的分享器對 NAT 對應的數目是有上限的, 所以我這樣的設計將還到實際的困難點, 請問有沒有什麼方法可以指定一個共用同一個PORT, 但又可讓 TIdTcpCleint 可以順利發訊息到任何已上線的電腦(不論是同網域或者InterNet網域) 註:外面指 可能是台灣各地區, 或者是同一網域的不同電腦 我的程式是 Delphi5 indy 6 FireBird xp 編輯記錄
P.D. 重新編輯於 2008-11-07 09:51:00, 註解 無‧
|
harpist
資深會員 發表:3 回覆:251 積分:430 註冊:2002-10-03 發送簡訊給我 |
|
2007
中階會員 發表:54 回覆:90 積分:98 註冊:2008-08-12 發送簡訊給我 |
可以對掉角色嗎?? 設計一支程式, 當程式資料庫有異動 這一邊 設為 server ,資料庫有異動 就送給 有跟你連線中的 Client 。
上線的電腦,只要一上線就連到你這一支程式 (server)。 ===================引 用 P.D. 文 章=================== 請問各位! 我在設計一支程式, 當程式資料庫有異動時, 以 TIdTcpClient 發 mesasge 到外面(註)電腦給 TidTcpServer接收, 當這些電腦收到這支程式的broadcast之後, 主動reflash database, 同時在畫面上進行更新顯示 現在有個問題 各電腦必須起 TidTcpServer, 每一個Server要有一個Port做waiting, 好讓 TIdTcpClient 可以經由這個port傳送消息, 但現在的狀況是 假設:這家公司在台北, 台中有分公司, 分公司內有10台電腦都要接這支程式, 每一台電腦都要一個Port, 而電腦又是躲在IP分享器後面, 換句話說, 台北總公司要連線這10台電腦, 就必須在台中的分享器把10組PORT都透通, 否則一定會被攔下來, 但一般的分享器對 NAT 對應的數目是有上限的, 所以我這樣的設計將還到實際的困難點, 請問有沒有什麼方法可以指定一個共用同一個PORT, 但又可讓 TIdTcpCleint 可以順利發訊息到任何已上線的電腦(不論是同網域或者InterNet網域) 註:外面指 可能是台灣各地區, 或者是同一網域的不同電腦 我的程式是 Delphi5 indy 6 FireBird xp |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
兩位所提的方法, 我有點疑惑
我所學習的Indy用法 TIdTcpSever 是負責接收訊息, TIdTcpClient是負責發送訊息 而我現在的想法是 異動的資料庫電腦掛 TIdTcpCleint, 外面的電腦掛TIdTcpServer, 當資料庫異動後, 由Cleint 連上Server送出訊息做動作, 然後Cleint 斷線, 但這就有一個狀況, 就是tIdTcpServer 在 listen 下一定有一個port必須加到 NAT中開通才可以 如果現在倒過來, 異動資料的掛TIdTcpServer, 外地的掛TIdTcpClient , 那當異動資料後, TIdTcpServer 如何通知 TIdTcpClient 呢? 這與我所認知的有誤差! |
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
HI~~, PD 版大,其實您已經知道 TIdTCPClient 有 Write ,而 TIdTCPServer 有 Read
當然他們也各有 Read 與 Write 但在 Server 下 Write ,這個很 ok ,但您的困惑是怎麼用 Client 接 請參考下面這段 Code 其實就是在 Client 加掛一個 Thread ,一直去讀 Buffer 的值,有的話代表 Server 有丟東西回來,則如此即可由 Server 端告知需更新的事, TIdTCPServer 因為他已經把 Client 傳過來的事件寫好了,所以我們都是在 OnExecute 時讀出資料,但 TIdTCPClient 因為沒有寫這段,所以必須靠我們自己寫,只是我也是很好奇,發展到 10 版了,怎麼會沒有加上這個,還得 User 自己加,可能是這樣彈性較大吧............... ※ 註,程式中的 ReadBuffer(CB, Sizeof(CB)); 這個 CB 是自定義的 Record ,您可以自訂您自己的封包結構 [code delphi] procedure TClientHandleThread.Execute; begin try while not Terminated do begin if not Client.Connected then Terminate else try Client.ReadBuffer(CB, Sizeof(CB)); Synchronize(HandleInput); except on E:Exception do begin if Client.Connected then Client.Disconnect; frmMain.tmAutoConnSvr.Enabled := True; end; end; end; except Self.Terminate; end; end; [/code] ===================引 用 P.D. 文 章=================== 兩位所提的方法, 我有點疑惑 我所學習的Indy用法 TIdTcpSever 是負責接收訊息, TIdTcpClient是負責發送訊息 而我現在的想法是 異動的資料庫電腦掛 TIdTcpCleint, 外面的電腦掛TIdTcpServer, 當資料庫異動後, 由Cleint 連上Server送出訊息做動作, 然後Cleint 斷線, 但這就有一個狀況, 就是tIdTcpServer 在 listen 下一定有一個port必須加到 NAT中開通才可以 如果現在倒過來, 異動資料的掛TIdTcpServer, 外地的掛TIdTcpClient , 那當異動資料後, TIdTcpServer 如何通知 TIdTcpClient 呢? 這與我所認知的有誤差!
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-11-08 00:07:20, 註解 無‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
感謝提供資料, 我先研究看看, 因為我用的是Indy6的元件, 好像與你提供的不太一樣, 謝謝!
===================引 用 careychen 文 章=================== HI~~, PD 版大,其實您已經知道 TIdTCPClient 有 Write ,而 TIdTCPServer 有 Read 當然他們也各有 Read 與 Write 但在 Server 下 Write ,這個很 ok ,但您的困惑是怎麼用 Client 接 請參考下面這段 Code 其實就是在 Client 加掛一個 Thread ,一直去讀 Buffer 的值,有的話代表 Server 有丟東西回來,則如此即可由 Server 端告知需更新的事, TIdTCPServer 因為他已經把 Client 傳過來的事件寫好了,所以我們都是在 OnExecute 時讀出資料,但 TIdTCPClient 因為沒有寫這段,所以必須靠我們自己寫,只是我也是很好奇,發展到 10 版了,怎麼會沒有加上這個,還得 User 自己加,可能是這樣彈性較大吧............... |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我也來插一腳,話說一些觀念性的問題… 參考參考、看看就好!
Server與Client的差別在哪? 最主要只是差在 server 有listen的功能,而client沒有 ! 至於讀與寫的問題,兩者的功能都是一樣的。 而Listen又有什麼關係? 它只是應用在第一次通訊時,誰決定了等待(被動),誰決定了(主動)求要連線! 假設S是server端,C是clinet端。那麼,以下的通訊順序為 1/ S Listen 2/ C 向 S提出連線請求 3/ S 接受 4/ 建立了連線… 連線後呢?? 就沒有所謂的順序性了,也就是說,可以s傳給c,也可以c傳給S, 堪至同時間 s傳c,c傳s… 簡單講就是當連線保持下,其實已經無分誰是server誰是clinet,沒有主與從的概念了。 因此,server可以隨時的送資料給client,只要client隨時保持可能有資料送來(如在thread中loop),進而處理隨時server傳來的訊息。 技術困難點: 如何讓client端在thread中少用一點資源,即不能呆呆的單純loop,可能會死人… 可用不同步io或者event來控制,簡單講就是有資料才讀,沒資料叫它自己"睡覺"! ===================引 用 P.D. 文 章=================== 兩位所提的方法, 我有點疑惑 我所學習的Indy用法 TIdTcpSever 是負責接收訊息, TIdTcpClient是負責發送訊息 而我現在的想法是 異動的資料庫電腦掛 TIdTcpCleint, 外面的電腦掛TIdTcpServer, 當資料庫異動後, 由Cleint 連上Server送出訊息做動作, 然後Cleint 斷線, 但這就有一個狀況, 就是tIdTcpServer 在 listen 下一定有一個port必須加到 NAT中開通才可以 如果現在倒過來, 異動資料的掛TIdTcpServer, 外地的掛TIdTcpClient , 那當異動資料後, TIdTcpServer 如何通知 TIdTcpClient 呢? 這與我所認知的有誤差!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
>Server與Client的差別在哪? 最主要只是差在 server 有listen的功能,而client沒有 ! 至於讀與寫的問題,兩者的功能都是一樣的。
>而Listen又有什麼關係? 它只是應用在第一次通訊時,誰決定了等待(被動),誰決定了(主動)求要連線! 這樣說是沒錯.可是.該加上一個 Socket Server/Client 是這個樣子. >簡單講就是當連線保持下,其實已經無分誰是server誰是clinet,沒有主與從的概念了。 這句話也要加一句 Socket server/Client Server/Client 的主從.在這個案例還是存在的. Client 的定義是提出需求者. Server 的定義是解決/處理需求或是提供服務者. 在這邊主從還是 database 的處理. >因此,server可以隨時的送資料給client,只要client隨時保持可能有資料送來(如在thread中loop),進而處理隨時server傳來的訊息。 >TIdTcpSever 是負責接收訊息, TIdTcpClient是負責發送訊息 Client 不會只有發送訊息的啦. 仔細想想.以 browser 來說. client (ie/ff) 向 web server 發起連線要求. web server 處理連線要求.(listen, accept....) client(ie/ff) 說我要 GET 那個網頁. web server 把網頁資料 write(sent...etc) 到 client client 接收網頁資料,然後處理顯示. 這樣.不就說明 socket client 有接收資料(訊息)嗎? 而且.也說明了.socket server 有發送資料(訊息)的能力嗎? |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
感謝各位前輩給予的基本觀念, 我大致有些輪廓了, 原本我是想盡量不讓外面電腦一直掛網連線總公司的server, 因為在外的電腦可能有10台, 20台...不知道, 所以才會想由公司的server主動連到各地廣播後就斷線(送一家成功, 就斷線), 這樣永遠都只有一個點在連線, 但經過各位的討論, 似乎都朝向由外地連進來到總公司, 然後再用thread或loop來偵測是否有總公司有發廣播進來再處理動作, 與原先的規劃有出入, 所以我要再仔細想一下原先的計劃! 謝謝
不過暗版主的一句話, 給我了一個頓悟, TClientSocket, TServerSocket 在我這個案例上似乎是更合適的做法, 我將朝Socket 方式研究看看, 就先結案了
編輯記錄
P.D. 重新編輯於 2008-11-09 11:26:10, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |