聊天室是一种典型的网络应用,这个程序演示了ICE框架的基本结构。

启动Server命令行
chatserver --Ice.Config=config.chatserver
带路由的client启动命令如下:

glacier2router --Ice.Config=/QTOA/ChatDemo-1.4.0/config/nfig.glacier2router

./chatgl2client --Ice.Config=/QTOA/ChatDemo-1.4.0/config/config.chatgl2client


不带路由的Poll方式启动client命令如下:
./chatpollclient --Ice.Config=/QTOA/ChatDemo-1.4.0/config/config.chatpollclient



1)定义SLICE接口。
module Chat {

interface  MessageReceiver {
    
void  onMessage( string  sender,  string  msg);
};

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

};
定义两个接口,Room用于服务器端实现,MessageReceiver用于客户端实现。
使用slice2cpp生成C++文件: chat.h, chat.cpp.

2)服务器端实现。
#include  < iostream >
#include 
< Ice / Ice.h >
#include 
" chat.h "

using  std:: string ;

class  ChatRoomI :  public  Chat::Room {
public :
    
virtual   bool  login( const   string & const  Chat::MessageReceiverPrx & const  Ice::Current & );
    
virtual   void  logout( const   string & const  Ice::Current & );
    
virtual   void  sendMessage( const   string & const   string & const  Ice::Current & );
private :
    
void  broadcast( const   string &  user,  const   string &  message);
    
bool  notify( const  Chat::MessageReceiverPrx &  receiver,  const   string &  sender,  const   string &  message);
    
    Chat::UserList    users_;
};

bool  ChatRoomI::login( const   string &  user,  const  Chat::MessageReceiverPrx &  receiver,  const  Ice::Current & ) {
    
if  (users_.find(user)  !=  users_.end()) {
         return   false ;
    }
    users_.insert(Chat::UserList::value_type(user, receiver));
    broadcast(user, 
" ---login--- " );
    
return   true ;
}

void  ChatRoomI::logout( const   string &  user,  const  Ice::Current & ) {
    users_.erase(user);
    broadcast(user, 
" ===logout=== " );
}

void  ChatRoomI::sendMessage( const   string &  user,  const   string &  message,  const  Ice::Current & ) {
    broadcast(user, message);
}

void  ChatRoomI::broadcast( const   string &  user,  const   string &  message) {
    Chat::UserList::iterator it 
=  users_.begin(), end  =  users_.end();
    
while  (it  !=  end) {
        
if  (user  !=  it -> first  &&   ! notify(it -> second, it -> first, message))
            users_.erase(it
++ );
        
else
            
++ it;
    }
}

bool  ChatRoomI::notify( const  Chat::MessageReceiverPrx &  receiver,  const   string &  sender,  const   string &  message) {
    
bool  ret  =   true ;    
    
try  {
        receiver
-> onMessage(sender, message);
    } 
catch ( const  std::exception &  ex) {
        ret 
=   false ;
    }
    
return  ret;
}

class  Server :  public  Ice::Application {
public :
    
virtual   int  run( int  argc,  char *  argv[]) {
        Ice::ObjectAdapterPtr adapter 
=  communicator() -> createObjectAdapterWithEndpoints(
                
" Chat.RoomAdapter " " default -p 10000 " );
        Chat::RoomPtr room 
=   new  ChatRoomI;
        adapter
-> add(room, communicator() -> stringToIdentity( " Chat.Room " ));
        adapter
-> activate();
        communicator()
-> waitForShutdown();
        
return   0 ;
    }
};

int  main( int  argc,  char *  argv[]) {
    Server app;
    
return  app.main(argc, argv);
}




3)客户端实现。
#include  < iostream >
#include 
< Ice / Ice.h >
#include 
" chat.h "

using  std:: string ;

class  ChatUserI :  public  Chat::MessageReceiver {
public :
    
virtual   void  onMessage( const   string &  user,  const   string &  message,  const  Ice::Current & ) {
        std::cout 
<<  user  <<   "  :   "   <<  message  <<  std::endl;
    }
};

class  Client :  public  Ice::Application {
public :
     virtual   int  run( int  argc,  char *  argv[]) {
        Chat::RoomPrx chatRoom 
=  Chat::RoomPrx::checkedCast(
                communicator()
-> stringToProxy( " Chat.Room:default -p 10000 " ));
        
if  ( ! chatRoom)  {
            std::cout 
<<   " Proxy not existed!/n " ;
            
return   - 1 ;
        }
    
        Ice::ObjectAdapterPtr adapter 
=  communicator() -> createObjectAdapterWithEndpoints(
                
" Chat.UserAdapter " " default " );
        Chat::MessageReceiverPtr user 
=   new  ChatUserI;
        adapter
-> add(user, communicator() -> stringToIdentity( " Chat.User " ));
        adapter
-> activate();
        
        Chat::MessageReceiverPrx userPrx 
=  Chat::MessageReceiverPrx::uncheckedCast(
                adapter
-> createProxy(communicator() -> stringToIdentity( " Chat.User " )));
        
        
string  name;
        std::cout 
<<   " Please input user name:  " ;
        std::cin 
>>  name;
        
if  ( ! chatRoom -> login(name, userPrx)) {
            std::cout 
<<   " login error: User Name already exist!/n " ;
            
return   0 ;
        }
        std::cout 
<<   " login OK! "   <<  std::endl;
        
        
string  message;
        
while  (std::getline(std::cin, message)  &&  message  !=   " quit " ) {
            chatRoom
-> sendMessage(name, message);
        }

        chatRoom
-> logout(name);

        
return   0 ;
    }
};

int  main( int  argc,  char *  argv[]) {
    Client app;
    
return  app.main(argc, argv);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值