• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            牽牛散步
            仗劍走天涯

            準備工作

            按照某人的說法:跨平臺的C++網絡編程ICE才是王道。于是,我學習ICE。

            ICE才出來兩年,是“一種現代的面向對象中間件,可用于替代像CORBA或COM/DCOM/COM+這樣的中間件。在易于學習的同時,它為各種有著苛刻的技術要求的應用提供了強大的網絡基礎設施。”Ice 3.0 已實現對C++, Java, Python, PHP, C# 及 Visual Basic 的支持。

            這里我就不多說了,大家可以參考這篇文章:《反叛之冰:Internet Communications Engine 》。大家可以下載的ICE的官方參考手冊,有中文版,不過是1.3.0版, 英文的是3.0版。

            ICE是開源的,大家可以從源代碼開始編譯,不過較復雜,幸好有binary版本,比如我就是下載的VS2003.NET的安裝包。安裝完成之后按照安裝目錄下的Readme對IDE進行一下配置,比如VC7.1就是把ice的include加入VC7.1的引用文件目錄,把ice的lib目錄加入VC7.1的庫文件目錄。然后再把安裝目錄下的bin文件夾添加到系統的環境變量Path中,最后,把bin文件夾下的所有DLL文件都Copy到Windows安裝目錄下的System32文件夾下(win98下是System文件夾?)。

            ICE自定義了一種SLICE語言,目的是定義接口,作用主要應該是保持對象調用或者數據傳輸時的語言無關性。

            開發一個ICE應用程序可以分為三步:

            1. 寫一個Slice定義, 并且編譯它

            2. 寫服務端, 并編譯它

            3. 寫客戶端, 并編譯它

            OK,寫一個小程序,實現客戶發送要打印的文本給服務器,再由服務器把文本發給打印機(這里我們用屏幕顯示替代),這里對代碼解讀請見下一章,這里不多說。

            1. 寫一個Slice定義, 并且編譯它:

              文件Printer.ice. 

              module Demo {
              interface Printer {
              	void printString(string s);
              	};
              };
              

              這個文件很簡單, 但需要注意, 在區分大小寫的系統上, 擴展名一定是小寫.

              編譯也很簡單,首先確認你已將你的bin目錄加到系統的環境變量Path中.然后把上面這個片斷保存成Printer.ice, 最后執行slice2cpp Printer.ice, 執行后的結果應該是自動生成了printer.h和printer.cpp.

            2. 寫服務端, 并編譯它

              文件server.cpp. 

              #include <Ice/Ice.h> 
              #include "../print.h"
              using namespace std;
              using namespace Demo;
              class PrinterI : public Printer {
              public:
              	virtual void printString(const string& s,const Ice::Current&);
              };
              void PrinterI::printString(const string& s, const Ice::Current&)
              {
              	cout << s << endl;
              }
              int  main(int argc, char* argv[])
              {
              	int status = 0;
              	Ice::CommunicatorPtr ic;
              	try {
              		ic = Ice::initialize(argc, argv);
              		Ice::ObjectAdapterPtr adapter
              			= ic->createObjectAdapterWithEndpoints(
              			"SimplePrinterAdapter", "default -p 10000");
              		Ice::ObjectPtr object = new PrinterI;
              		adapter->add(object,
              			Ice::stringToIdentity("SimplePrinter"));
              		adapter->activate();
              		ic->waitForShutdown();
              	} catch (const Ice::Exception& e) {
              			cerr << e << endl;
              		status = 1;
              	} catch (const char* msg) {
              		cerr << msg << endl;
              		status = 1;
              	}
              	if (ic) {
              		try {
              			ic->destroy();
              		} catch (const Ice::Exception& e) {
              			cerr << e << endl;
              			status = 1;
              		}
              	}
              	return status;
              }
              

              以VS2003的配置為例

              1. 把ice的include加入VC7.1的引用文件目錄,把ice的lib目錄加入VC7.1的庫文件目錄。然后再把安裝目錄下的bin文件夾添加到系統的環境變量Path中,最后,把bin文件夾下的所有DLL文件都Copy到Windows安裝目錄下的System32文件夾下(win98下是System文件夾?)(當然,DLL文件的問題也可以通過修改環境變量來解決,不過是那個變量呢?Who can tell me?)

              2. 新建一個C++的Win32的命令臺控制程序,并且設置為空項目, 把server.cpp, printer.cpp和printer.h加入這個項目(printer.cpp和printer.h放在項目的目錄的外一層目錄)

              3. 項目-》屬性-》C/C++ -》代碼生成-》運行時庫-》/MD(realse版)或/MDd(debug版)

                項目-》配置屬性-》C/C++-》語言-》啟用運行時類型信息/GR 開啟

                設置:項目-》屬性-》鏈接器-》輸入-》加入iced.lib iceutild.lib,此處一定要把realse庫和debug庫分清, debug庫后有個d

              4. 修改printer.cpp中的#include <printer.h>為#include "printer.h"

              5. OK,編譯

            3. 寫客戶端,并編譯它

              文件client.cpp. 

              #include <Ice/Ice.h>
              #include "..\print.h"
              using namespace std;
              using namespace Demo;
              int main(int argc, char* argv[])
              {
              	int status = 0;
              	Ice::CommunicatorPtr ic;
              	try {
              		ic = Ice::initialize(argc, argv);
              		Ice::ObjectPrx base = ic->stringToProxy(
              			"SimplePrinter:default -p 10000");
              		PrinterPrx printer = PrinterPrx::checkedCast(base);
              		if (!printer)
              			throw "Invalid proxy";
              		printer->printString("Hello World!");
              	} catch (const Ice::Exception& ex) {
              		cerr << ex << endl;
              		status = 1;
              	} catch (const char* msg) {
              		cerr << msg << endl;
              		status = 1;
              	}
              	if (ic)
              		ic->destroy();
              	return status;
              }
              

              添加一個新項目到當前解決方案,按照上面的方法,對client再一次進行設置。

              在解決方案管理器的解決方案上點擊右鍵,選擇批生成Debug版本,然到用資源管理器到兩個解決方案的目錄下的Debug文件夾中執行生產的可執行文件。先運行server.exe, 然后運行client.exe, 哈哈, 是不是在server.exe的窗口里出現了Hello World!(運行一次client.exe,出現一條)

             

            文章源地址:http://enjoylanguage.sourceforge.net/%5Bxhtml_chunk_sourceForge%5D/ch02.html

            posted @ 2005-12-13 11:56 牽牛散步 閱讀(3692) | 評論 (5)編輯 收藏
             

            最近開始學習ICE,頭有點大,900多頁的文檔看了五百多頁還不知CLIENT如何定位SERVER的位置,郁悶的很...昨天毛了直接看文檔的最后幾頁..我暈原來在這里給闡述了...差不多想撞墻

            以下是中文文檔中關于端點的描述:

            D.2 端點
            綱要
            endpoint : endpoint
            描述
            端點列表由一個或多個用冒號(:) 分隔的端點組成。端點的格式如下所
            示: protocol option。所支持的協議有tcp、udp、ssl,以及
            default。如果使用了default,它會被Ice.Default.Protocol 屬性的值替
            代。如果端點的格式有問題,或者指定了未知的協議,應用會收到
            Ice::EndpointParseException。
            只有安裝了IceSSL 插件,才能使用ssl 協議。
            各個協議及其所支持的選項將在下面描述。
            TCP 端點
            綱要
            tcp -h host -p port -t timeout -z
            描述
            tcp 端點支持以下選項:
            選項描述客戶語義服務器語義
            -h host 指定端點的主機名
            或IP 地址。如果
            沒有指定,將使用
            Ice.Default.Hos
            t 的值。
            確定要連接到的主
            機名或IP 地址。
            確定對象適配器用
            于偵聽連接的網絡
            接口,以及在適配
            器所創建的代理中
            向外公布的主機
            名。
            -p port 指定端點的端口
            號。
            確定要連接到的端
            口( 必須指定)。
            如果沒有指定這個
            選項,或是port 為
            零,端口將由操作
            系統選擇。
            932 代理與端點


            以上是基于TCP協議的,關于UDP,SSL協議的也差不多

            我在我的聊天程序中連接LAN中一臺服務器的代碼:
            #include <Ice/Ice.h>
            #include <Printer.h>

            using namespace std;
            using namespace Demo;


            int main(int argc, char * argv[])
            {
                int status = 0;
             char strtemp[100];//聊天內容
             char clientname[20];//客戶名
             char chattmp[130];
                Ice::CommunicatorPtr ic;
                try {
              ic = Ice::initialize(argc, argv);
            /*連接服務器:SimplePrinter16所申請的代理ID,default即為使用默認的協議TCP,-h 192.168.1.16 為服務端所在LAN中的IP地址,-p 9600為端口號*/
              Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter16:default -h 192.168.1.16 -p 9600");
              //創建一個Printer的代理(Printer即為客戶端與服務器端的接口),利用checkedCast(base)檢查代理是否存在
              PrinterPrx printer = PrinterPrx::checkedCast(base);
              if (!printer)
              {
               throw "Invalid proxy";//代理不存在
              }
              else
              {
               printf("請輸入您的ID:");
               cin >> clientname;
              }

              while ( 1 )
              {
               cin >> strtemp;//輸入聊天內容
               if ( strcmp( strtemp,"q") == 0 )
               {
                break;//退出聊天
               }
               //strcat( chattmp, clientname );
               strcpy( chattmp, clientname );
               strcat( chattmp, " say: " );
               strcat( chattmp, strtemp );
               printer->printString(chattmp);
              }
              
              //發給服務器的退出消息
              printer->printString(clientname);
              printer->printString("已退出!");
              cout << "成功退出!" << endl;
              
                } catch (const Ice::Exception & ex) {
              cerr << ex << endl;
              status = 1;
                } catch (const char * msg) {
              cerr << msg << endl;
              status = 1;
                }
                if (ic) {
              try {
               ic->destroy();
              } catch (const Ice::Exception & ex) {
               cerr << ex << endl;
               status = 1;
              }
                }
                return status;
            }

            posted @ 2005-12-09 20:10 牽牛散步 閱讀(3229) | 評論 (3)編輯 收藏
            僅列出標題
            共2頁: 1 2 
             
            国内精品欧美久久精品| 久久综合给合久久国产免费 | 97精品伊人久久大香线蕉| 国产激情久久久久久熟女老人| 国产一级持黄大片99久久| 久久久久久国产a免费观看黄色大片 | 办公室久久精品| 人妻久久久一区二区三区| 久久99精品久久久久久动态图| 久久精品国产精品亚洲艾草网美妙| 无码人妻久久一区二区三区| 久久毛片一区二区| 久久无码av三级| 久久青草国产手机看片福利盒子| 国产一区二区精品久久岳| 亚洲综合伊人久久综合| 久久综合狠狠综合久久97色| 国产精品午夜久久| 亚洲中文字幕无码一久久区| 久久久久人妻一区精品果冻| 国产精品女同久久久久电影院| 三级韩国一区久久二区综合| 综合久久精品色| 成人久久免费网站| 久久精品无码一区二区日韩AV| 九九99精品久久久久久| 中文字幕久久精品无码| 亚洲精品无码久久毛片| 国产精品无码久久综合网| 久久被窝电影亚洲爽爽爽| 久久婷婷五月综合色高清| 中文精品久久久久人妻不卡| 久久婷婷五月综合成人D啪| 国产福利电影一区二区三区久久老子无码午夜伦不| 国产免费久久精品99re丫y| 久久亚洲AV无码西西人体| 久久综合精品国产一区二区三区| 国产日韩久久免费影院| 久久精品国产亚洲7777| 久久久久国产一区二区三区| 久久精品亚洲福利|