全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2602
推到 Plurk!
推到 Facebook!

Indy 如何達成多點傳送的功能

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-07 09:49:58 IP:219.68.xxx.xxx 未訂閱
請問各位!

我在設計一支程式, 當程式資料庫有異動時, 以 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-07 09:59:06 IP:59.120.xxx.xxx 未訂閱
要不要考慮把 Server 跟 Client 反過來,這樣彈性可能比較大。
------
~§~迷時師渡,悟了自渡~§~
2007
中階會員


發表:54
回覆:90
積分:98
註冊:2008-08-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-07 10:04:09 IP:220.132.xxx.xxx 未訂閱
可以對掉角色嗎??  設計一支程式, 當程式資料庫有異動 這一邊 設為 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-07 22:44:52 IP:219.68.xxx.xxx 未訂閱
兩位所提的方法, 我有點疑惑
我所學習的Indy用法
TIdTcpSever 是負責接收訊息, TIdTcpClient是負責發送訊息
而我現在的想法是 異動的資料庫電腦掛 TIdTcpCleint, 外面的電腦掛TIdTcpServer, 當資料庫異動後, 由Cleint 連上Server送出訊息做動作, 然後Cleint 斷線, 但這就有一個狀況, 就是tIdTcpServer 在 listen 下一定有一個port必須加到 NAT中開通才可以
如果現在倒過來, 異動資料的掛TIdTcpServer, 外地的掛TIdTcpClient ,
那當異動資料後, TIdTcpServer 如何通知 TIdTcpClient 呢? 這與我所認知的有誤差!
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-08 00:05:10 IP:59.126.xxx.xxx 訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-08 00:19:43 IP:219.68.xxx.xxx 未訂閱
感謝提供資料, 我先研究看看, 因為我用的是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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-08 06:39:39 IP:59.115.xxx.xxx 訂閱
我也來插一腳,話說一些觀念性的問題… 參考參考、看看就好!

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
編輯記錄
aftcast 重新編輯於 2008-11-08 06:44:21, 註解 無‧
aftcast 重新編輯於 2008-11-08 06:48:22, 註解 無‧
aftcast 重新編輯於 2008-11-08 06:49:31, 註解 無‧
暗黑破壞神
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-08 10:38:45 IP:122.118.xxx.xxx 未訂閱
>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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-08 22:25:13 IP:219.68.xxx.xxx 未訂閱
感謝各位前輩給予的基本觀念, 我大致有些輪廓了, 原本我是想盡量不讓外面電腦一直掛網連線總公司的server, 因為在外的電腦可能有10台, 20台...不知道, 所以才會想由公司的server主動連到各地廣播後就斷線(送一家成功, 就斷線), 這樣永遠都只有一個點在連線, 但經過各位的討論, 似乎都朝向由外地連進來到總公司, 然後再用thread或loop來偵測是否有總公司有發廣播進來再處理動作, 與原先的規劃有出入, 所以我要再仔細想一下原先的計劃! 謝謝

不過暗版主的一句話, 給我了一個頓悟, TClientSocket, TServerSocket 在我這個案例上似乎是更合適的做法, 我將朝Socket 方式研究看看, 就先結案了
編輯記錄
P.D. 重新編輯於 2008-11-09 11:26:10, 註解 無‧
系統時間:2024-03-29 3:07:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!