zoukankan      html  css  js  c++  java
  • 使用ICE建立C++与C#的通讯

    使用ICE建立C++与C#的通讯

        ICE的优势是作为通讯中间件可支持跨平台的通讯,目前支持C++、C#、JAVA、Python、Ruby等多种语言。下面通过一个示例,描述怎样通过ICE建立C++与C#之间的通讯。

    一 示例描述

        搭建一个简单的聊天室,服务端使用C++实现,客户端使用C#实现,中间以ICE构建通讯通道。聊天室实现的功能包括:用户登录/注销、发送消息、接受消息。

    二 准备Slice文件

        Slice作为ICE本身特有的语言,成为跨平台通讯的桥梁。通过Slice文件描述需要实现的接口,再由ICE提供的各个语言编译器生成各语言的接口类,各语言分别负责根据接口类实现属于本身的逻辑细节即可,据说这种思想是从老牌的通讯中间件CORBA中借鉴过来的。

        聊天室的Slice文件定义如下:

    module Chat {
    
    interface Room {
    
        bool login(string user, MessageReceiver* receiver);
    
        void logout(string user);
    
        void sendMessage(string user, string message);
    
    };
    
    interface MessageReceiver {
    
        void onMessage(string sender, string msg);
    
    };
    
    dictionary<string, MessageReceiver*> UserList;
    
    };

       分析上面的Slice文件如下:

    1、 在命名空间为Chat下定义了两个类(接口),Room和MessageReceiver。

    2、 Room主要是Server端实现,Client端调用。实现了登录、注销和发送信息的接口函数。

    3、 MessageReceiver主要是Client端实现,Server端调用的回调函数接口。这是因为Server端在向Client端发送信息的时候,必须知道Client端的通讯地址。因此需要这个回调函数类。

    4、 UserList主要是Server端用来存储Client端的用户名及回调函数句柄的。

    三 实现Server端

        通过Slice2Cpp程序将Slice文件生成ChatRoom.h和ChatRoom.cpp,将两个文件加入到工程中,同时新建一个类继承Chat::Room,实现Room的三个虚拟函数接口,这个类被称为Server端的Servant类。代码如下:

          

    class ChatRoomI :public Chat::Room
    
           {
    
           public:
    
                  ChatRoomI(void);
    
                  ~ChatRoomI(void);
    
                  virtual bool login(const ::std::string&, const ::Chat::MessageReceiverPrx&, const ::Ice::Current& );
    
                   virtual void logout(const ::std::string&, const ::Ice::Current& );
    
                  virtual void sendMessage(const ::std::string&, const ::std::string&, const ::Ice::Current&);
    
           private :
    
                  Chat::UserList _userList;
    
                  void BroadCast(const ::std::string user,const ::std::string message);
    
                  bool Notify(const ::std::string& user, const ::std::string& message, const ::Chat::MessageReceiverPrx& receiver);
    
     
    
           };

        注意有两个私有函数BroadCast和Notify为从Server端广播消息至Client端时用到的,并没有什么神秘的地方。示例工程可在文章末尾处下载,具体实现细节略去。

    四 实现Client端

        使用Slice2CS程序将Slice文件生成ChatRoom.cs文件,将此cs文件添加到一个控制台程序的工程中。新建MsgReceiver类继承Chat.MessageReceiverDisp_,Chat.MessageReceiverOperations_两个抽象类,实现onMessage函数。

    public override void onMessage(string sender, string msg, Ice.Current current__)
    
        {
    
            Console.WriteLine(String.Format("{0}:{1}", sender, msg));
    
         }

    新建Client类,实现Client端与Server端之间的通讯逻辑,并生成MsgReceiver类的本地代理类,发送到Server端实现发送消息的回调逻辑。

                Ice.ObjectAdapter objAdapter =  communicator().createObjectAdapterWithEndpoints(
    
                    "Chat.UserAdapter", "default -h 127.0.0.1 -p 10001");
    
                Ice.Object msgRece = new MsgReceiver();
    
                objAdapter.add(msgRece,communicator().stringToIdentity("Chat.User"));
    
                objAdapter.activate();
    
     
    
                 Chat.MessageReceiverPrx userPrx = Chat.MessageReceiverPrxHelper.uncheckedCast
    
    (objAdapter.createProxy(communicator().stringToIdentity("Chat.User")));

    示例工程在本文末尾下载。

     

    四 示例截图

    Server端:

    Client端:

     代码下载:

    Server

    Client

     

     

     

  • 相关阅读:
    基于Visual C++2013拆解世界五百强面试题--题9-找出所有的排列方式
    基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找
    基于Visual C++2013拆解世界五百强面试题--题7-链表的各种操作
    宣布在 Azure 镜像库中正式推出 Windows Server 2012 R2 并降低 Windows Azure 的实例定价
    基于Visual C++2013拆解世界五百强面试题--题6-double类型逆序
    基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr
    Paging
    Swapping
    Partitioning
    Stationary point
  • 原文地址:https://www.cnblogs.com/liwei81730/p/2649476.html
Copyright © 2011-2022 走看看