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

Datasnap對wifi的支援問題

缺席
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2017-06-27 13:43:17 IP:118.160.xxx.xxx 未訂閱
各位好:

這個問題真的有點很難用文字表達, 容我用較長篇幅解釋的現在的架構, 以及遭遇到問題, 我目前仍找不到答案, 網路上也不知道該如何發問才能出現我想要看到的資訊, 所以只好來此求助各位

環境
server端 win10 x64 筆電 xe10.2 firebird 2.11(x86)
client端 win10 x32 平板 10.2 firebird 2.11(x86)
以上環境都沒在沒有安裝 RadStudio 系統下運作

程式
Datasnap Server(不是DataSnap Rest, 其他參數都是預設值), uese midaslib
--> ServerMethod1 (存放 DatasetProvider1)
-->DataModule (存放 firebird IBDataBase1, IBtransactdion1, IBQuery1)

Datasanp Client(是DataSnap Client, 也不是Rest架構, 其他參數都是預設值)
--> ClientModuleUnit1 (存放 SQLconnection1, DSProviderConnection1 及 clientDataSet1)
--> DSProviderConnection.ServerClassName := TServerMethoid1
--> ClientDataSet1.RemoteServer:= DSProviderConnection1
ClientDataSet1.ProviderName:= DataSetProvider1 ( ServerMethod1中的providername)

連線流程
當 ClientModuleUnit1 透過 SQLconnection1.connected := True 的狀況, 令DataSnap Server 自動創建 TServerMehtoid1 後,
由Client端送了一個 EchoString 給 server (例如 'opendata')
在Server端的 EchoString function 會收到這個string 'opendata', 然後我就手動 Create一個DataMoudle (DataMoudle1 := DataMoudle.Create(ni) (註使用 self 或 nil 結果是一樣的)
在 DataMoudle 中就會指定 Firebird 的 database(xxx.gdb)等等設定
再在 Server端開啟 DataMoudle 後, 同時指定 TServerMethod1.DatasetProvider.DataSet := DataMoudle1.IBQuery1
當 Client端下 SQLconnection1.connected := False 之前, 一樣送一個EchoString ('closedata') 給 server, Server收到後將DataModule1.Free掉
然後執行 SQKconnection1.connected:= False, 結束這次 DataSnap server 的 session

以上是大致的寫法過程
狀況一
Server端使用 RJ-45接網(192.168.1.100 後端是無線d-link ip分享器), 起 DataSnap Server --> ok
Cient端利用 同一網域, 使用該分享器的網路(192.168.1.101), 當然我把 Client端的 SQLconnect 中的 Host 指向 192.168.1.100
然後下 SQLconnection1.connected := True, 順利接上DataSnap, 再呼叫CientDatasetpd l順利取得我要的 Records

狀況二
Server端使用 拔除RJ-45接網 , 改由筆電抓取wifi 取得 ip 192.168.1.110 (後端還是無線d-link ip分享器), 起 DataSnap Server --> ok
Cient端利用 同一網域, 使用該分享器的網路(192.168.1.101), 把 Client端的 SQLconnect 中的 Host 指向 192.168.1.110
然後下 SQLconnection1.connected := True, 順利接上DataSnap, 再呼叫CientDatasetpd l順利取得我要的 Records

狀況三(有問題的)
我開啟手機的行動網路分享(HTC 10)
Server端由筆電抓取HTC 分享網路 wifi 取得 ip 192.168.1.211, 起 DataSnap Server --> ok
Cient端也是抓取HTC 分享網路 ip 192.168.1.210), 把 Client端的 SQLconnect 中的 Host 指向 192.168.1.211
然後下 SQLconnection1.connected := True, 順利接上DataSnap, (下EchoString, Server能順利承接), 但呼叫CientDatasetpd 後, 無法取到 Server端的 IBQuery1 的 Records, 在 Server端出現 DataBaes is not assigned 的錯誤訊息

狀況三(正常的)
所有的網路串接與狀況三完全一樣,
但這個我是改 Server 的寫法, 原本是 ServerMethod1 連上後才開啟FirdBrid 的 DataMoudle, 我改成
把 DataMoudle1 的三組元件(IBDataBase1, IBTranscation1, IBQuery1) 直接放在 ServerMethod1上, 不要用 DataMoudle 的做法了, DatasetProvider 改指定為 ServerMethoid1 上的 IBquery1
這回整個運作都是ok的

所以, 整個我想表達的是什麼使用手機的網路分享會造成 DataSnap ClientDataset 無法讀取資料(在狀況三的環境下), 但使用有線網路或分享器卻可以通過, 這是我想了解的, why? 是不是有特別的限制呢?
會發現這個問題是因為我都是在桌機上設定程式, 昨天要展示給客戶看Datasnap的效果, 因為選在速食店, 只能用手機連網測, 結果都一直當機, 回來後花了一整天的時間抓錯, 才發現上面4個狀況,
寫了一堆, 希望大家能看得懂, 不知有沒有什麼方向可尋?

感恩~~
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2017-06-29 10:11:35 IP:1.164.xxx.xxx 未訂閱
如果你不是用 http 通訊協定,就有可能在某些功能不全的 IP分享器出現問題
問題點大概都是可以連線 但無法傳輸資料
why?因為那些IP分享器 原本就是設計給人看網頁用的(web) 其他通訊協定大概也沒啥測過
更不用說你這顆 Sqlconnection了

解決的方法就是改用 http

打造強固穩定的server 通訊協定只是其中一環
其他要注意的點 我在這篇已經講過了
http://delphi.ktop.com.tw/board.php?cid=30&fid=68&tid=105191

===================引 用 P.D. 文 章===================
各位好:

這個問題真的有點很難用文字表達, 容我用較長篇幅解釋的現在的架構, 以及遭遇到問題, 我目前仍找不到答案, 網路上也不知道該如何發問才能出現我想要看到的資訊, 所以只好來此求助各位

環境
server端 win10 x64 筆電 xe10.2 firebird 2.11(x86)
client端 win10 x32 平板 10.2 firebird 2.11(x86)
以上環境都沒在沒有安裝 RadStudio 系統下運作

程式
Datasnap Server(不是DataSnap Rest, 其他參數都是預設值), uese midaslib
--> ServerMethod1 (存放 DatasetProvider1)
-->DataModule (存放 firebird IBDataBase1, IBtransactdion1, IBQuery1)

Datasanp Client(是DataSnap Client, 也不是Rest架構, 其他參數都是預設值)
--> ClientModuleUnit1 (存放 SQLconnection1, DSProviderConnection1 及 clientDataSet1)
--> DSProviderConnection.ServerClassName := TServerMethoid1
--> ClientDataSet1.RemoteServer:= DSProviderConnection1
ClientDataSet1.ProviderName:= DataSetProvider1 ( ServerMethod1中的providername)

連線流程
當 ClientModuleUnit1 透過 SQLconnection1.connected := True 的狀況, 令DataSnap Server 自動創建 TServerMehtoid1 後,
由Client端送了一個 EchoString 給 server (例如 'opendata')
在Server端的 EchoString function 會收到這個string 'opendata', 然後我就手動 Create一個DataMoudle (DataMoudle1 := DataMoudle.Create(ni) (註使用 self 或 nil 結果是一樣的)
在 DataMoudle 中就會指定 Firebird 的 database(xxx.gdb)等等設定
再在 Server端開啟 DataMoudle 後, 同時指定 TServerMethod1.DatasetProvider.DataSet := DataMoudle1.IBQuery1
當 Client端下 SQLconnection1.connected := False 之前, 一樣送一個EchoString ('closedata') 給 server, Server收到後將DataModule1.Free掉
然後執行 SQKconnection1.connected:= False, 結束這次 DataSnap server 的 session

以上是大致的寫法過程
狀況一
Server端使用 RJ-45接網(192.168.1.100 後端是無線d-link ip分享器), 起 DataSnap Server --> ok
Cient端利用 同一網域, 使用該分享器的網路(192.168.1.101), 當然我把 Client端的 SQLconnect 中的 Host 指向 192.168.1.100
然後下 SQLconnection1.connected := True, 順利接上DataSnap, 再呼叫CientDatasetpd l順利取得我要的 Records

狀況二
Server端使用 拔除RJ-45接網 , 改由筆電抓取wifi 取得 ip 192.168.1.110 (後端還是無線d-link ip分享器), 起 DataSnap Server --> ok
Cient端利用 同一網域, 使用該分享器的網路(192.168.1.101), 把 Client端的 SQLconnect 中的 Host 指向 192.168.1.110
然後下 SQLconnection1.connected := True, 順利接上DataSnap, 再呼叫CientDatasetpd l順利取得我要的 Records

狀況三(有問題的)
我開啟手機的行動網路分享(HTC 10)
Server端由筆電抓取HTC 分享網路 wifi 取得 ip 192.168.1.211, 起 DataSnap Server --> ok
Cient端也是抓取HTC 分享網路 ip 192.168.1.210), 把 Client端的 SQLconnect 中的 Host 指向 192.168.1.211
然後下 SQLconnection1.connected := True, 順利接上DataSnap, (下EchoString, Server能順利承接), 但呼叫CientDatasetpd 後, 無法取到 Server端的 IBQuery1 的 Records, 在 Server端出現 DataBaes is not assigned 的錯誤訊息

狀況三(正常的)
所有的網路串接與狀況三完全一樣,
但這個我是改 Server 的寫法, 原本是 ServerMethod1 連上後才開啟FirdBrid 的 DataMoudle, 我改成
把 DataMoudle1 的三組元件(IBDataBase1, IBTranscation1, IBQuery1) 直接放在 ServerMethod1上, 不要用 DataMoudle 的做法了, DatasetProvider 改指定為 ServerMethoid1 上的 IBquery1
這回整個運作都是ok的

所以, 整個我想表達的是什麼使用手機的網路分享會造成 DataSnap ClientDataset 無法讀取資料(在狀況三的環境下), 但使用有線網路或分享器卻可以通過, 這是我想了解的, why? 是不是有特別的限制呢?
會發現這個問題是因為我都是在桌機上設定程式, 昨天要展示給客戶看Datasnap的效果, 因為選在速食店, 只能用手機連網測, 結果都一直當機, 回來後花了一整天的時間抓錯, 才發現上面4個狀況,
寫了一堆, 希望大家能看得懂, 不知有沒有什麼方向可尋?

感恩~~
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2017-06-29 15:48:13 IP:118.169.xxx.xxx 未訂閱
感謝 leveon兄的提點, 我的確不是用http(預設是 tcp/ip), 對於 datasnap我的接觸也不過短短一年多的經驗, 還是很初淺的學習者, 所以有很多觀念可能都不完整或正確(畢竟大部份都是自學及谷神教來的), 我會再朝http方向進行測試研究看看, 謝謝!
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2017-06-30 11:52:13 IP:1.164.xxx.xxx 未訂閱
很好奇
你現在是還在研發中 還是已經有客戶在實際運行 "Datasnap" ?
如果有 目前運行的狀況是?

因為我一直認為他只是個玩具 不能對他認真
但驚訝的是 一直會有人去使用他 討論他

===================引 用 P.D. 文 章===================
感謝 leveon兄的提點, 我的確不是用http(預設是 tcp/ip), 對於 datasnap我的接觸也不過短短一年多的經驗, 還是很初淺的學習者, 所以有很多觀念可能都不完整或正確(畢竟大部份都是自學及谷神教來的), 我會再朝http方向進行測試研究看看, 謝謝!
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2017-07-01 08:23:48 IP:61.224.xxx.xxx 未訂閱
對於我們的客戶群, 這個"玩具" 基本已經夠用了, 目前也有客戶在使用中, 並沒有太大的問題, 直到現在我都還是以client-server為架構+delphi5在開發, 其實我覺得, 軟體無好壞, 只要用對地方, 客戶使用就能接受, 所以delphi5除了不支援unicode外, 還是很好用的, 改用xe 是為了跨平台及unicode這兩項訴求
===================引 用 leveon 文 章===================
很好奇
你現在是還在研發中 還是已經有客戶在實際運行 "Datasnap" ?
如果有 目前運行的狀況是?

因為我一直認為他只是個玩具 不能對他認真
但驚訝的是 一直會有人去使用他 討論他

===================引 用 P.D. 文 章===================
感謝 leveon兄的提點, 我的確不是用http(預設是 tcp/ip), 對於 datasnap我的接觸也不過短短一年多的經驗, 還是很初淺的學習者, 所以有很多觀念可能都不完整或正確(畢竟大部份都是自學及谷神教來的), 我會再朝http方向進行測試研究看看, 謝謝!
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2017-07-01 14:33:33 IP:114.43.xxx.xxx 未訂閱
個人看法 如果"堅持"要用Datasnap 那還不如用 RO
http://www.remotingsdk.com/ro/
雖然RO缺點也不少
但基本上 RO就是一個Bug比較少的Datasnap
算是3rd中做的比較好的

在中國的Delphi相關論壇也常見討論RO
不少中國的三層框架元件也是山寨RO


很奇怪的是
除了找到15年前 這個站的某個版主分享過外
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=27209
這個站似乎沒人在推薦討論除了Datasnap外的其他方案
看了你的回答 才知道原來大部分的產品都還在使用Client/server 架構
可能是產品只針對台灣 而台灣只是個小島 不似大陸幅員廣大 異地需求不高
一兩個外地點 頂多是用個RDP就能搞定了

不過自架Server的時代早就過去了 開發者早就頃向採用現成雲端服務
API參數傳一傳就搞定了 誰還去學習複雜的Server架設技術?
看看AWS google azure 這些服務營收年年創新高就知道了

===================引 用 P.D. 文 章===================
對於我們的客戶群, 這個"玩具" 基本已經夠用了, 目前也有客戶在使用中, 並沒有太大的問題, 直到現在我都還是以client-server為架構 delphi5在開發, 其實我覺得, 軟體無好壞, 只要用對地方, 客戶使用就能接受, 所以delphi5除了不支援unicode外, 還是很好用的, 改用xe 是為了跨平台及unicode這兩項訴求
===================引 用 leveon 文 章===================
很好奇
你現在是還在研發中 還是已經有客戶在實際運行 "Datasnap" ?
如果有 目前運行的狀況是?

因為我一直認為他只是個玩具 不能對他認真
但驚訝的是 一直會有人去使用他 討論他

===================引 用 P.D. 文 章===================
感謝 leveon兄的提點, 我的確不是用http(預設是 tcp/ip), 對於 datasnap我的接觸也不過短短一年多的經驗, 還是很初淺的學習者, 所以有很多觀念可能都不完整或正確(畢竟大部份都是自學及谷神教來的), 我會再朝http方向進行測試研究看看, 謝謝!
pcplayer99
尊榮會員


發表:142
回覆:740
積分:591
註冊:2003-01-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2017-11-06 18:37:12 IP:120.237.xxx.xxx 未訂閱
DataSnap 我不熟悉,但它应该是通过 server 的 211 port 的 TCP connection 来执行 client 和 server 通讯的。

也就是说,不管什么方式,只要 client 和 server 之间,能够建立起 TCP connection,就不应该有问题。

DataBaes is not assigned】这个错误,看起来是你的代码在创建 DataBase 连接的时候没有成功导致。你可以在 server 端下断点看看究竟是走到哪一步。

另外,你的 DataBase Server 和你的 DataSnap Server 是在同一台物理 Server 上的吗?
系統時間:2017-11-22 11:41:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!