zoukankan      html  css  js  c++  java
  • ICE提纲之demo/Glacier2/callback(跨网回调)

    本例子展示了Glacier2 router的用法(没有使用Glacier2 session manager)。

    如果clients与router不在同一台主机上,需要将以下地方修改为glacier2router所在机器的外部地址:

    config.glacier2的Glacier2.Client.Endpoints
    config.client的Ice.Default.Router和Callback.Client.Router

    Glacier2router服务

    启动命令

    $ glacier2router --Ice.Config=config.glacier2

    config.glacier2

    #

    # Set the instance name

    #

    Glacier2.InstanceName=DemoGlacier2

     

    #

    # The client-visible endpoint of Glacier2. This should be an endpoint

    # visible from the public Internet, and it should be secure.

    Glacier2.Client.Endpoints=ssl -p 4064 -h localhost

     

    #

    # The server-visible endpoint of Glacier2. This endpoint is only

    # required if callbacks are needed (leave empty otherwise). This

    # should be an endpoint on an internal network (like 192.168.x.x), or

    # on the loopback, so that the server is not directly accessible from

    # the Internet.

    #

    Glacier2.Server.Endpoints=tcp -h localhost

     

    # For this demo, we use a null permissions verifier.

    Glacier2.PermissionsVerifier=DemoGlacier2/NullPermissionsVerifier

     

    #

    # The timeout for inactive sessions. If any client session is inactive

    # for longer than this value, the session expires and is removed. The

    # unit is seconds.

    #

    Glacier2.SessionTimeout=30

     

    #

    # Glacier can forward requests buffered or unbuffered. Unbuffered

    # means a lower resource consumption, as buffering requires one

    # additional thread per connected client or server. However, without

    # buffering, messages cannot be batched and message overriding doesn't

    # work either. Also, with unbuffered request forwarding, the caller

    # thread blocks for twoway requests.

    # The default is to use buffering (=1), in both directions.

    #Glacier2.Client.Buffered=0

    #Glacier2.Server.Buffered=0

     

    #

    # These two lines instruct Glacier2 to forward contexts both for

    # regular routing, as well as for callbacks (reverse routing).

    #

    Glacier2.Client.ForwardContext=1

    Glacier2.Server.ForwardContext=1

     

    #

    # To prevent Glacier2 from being flooded with requests from or to one

    # particular client, Glacier2 can be configured to sleep for a certain

    # period after all current requests for this client have been

    # forwarded. During this sleep period, new requests for the client are

    # queued. These requests are then all sent once the sleep period is

    # over. The unit is milliseconds.

    #

    Glacier2.Client.SleepTime=500

    Glacier2.Server.SleepTime=500

     

    #

    # With the two settings below, Glacier2 can be instructed to always

    # batch oneways, even if they are sent with a _fwd/o instead of a

    # _fwd/O context.

    # The default value for Glacier2.Client.AlwaysBatch and 

    # Glacier2.Server.AlwaysBatch is 0.

    #Glacier2.Client.AlwaysBatch=1

    #Glacier2.Server.AlwaysBatch=1

     

    #

    # Glacier2 always disables active connection management so there is no

    # need to configure this manually. Connection retry does not need to

    # be disabled, as it's safe for Glacier2 to retry outgoing connections

    # to servers. Retry for incoming connections from clients must be

    # disabled in the clients.

    #

    Slice

    Callback.ice

    module Demo

    {

     

    interface CallbackReceiver

    {

        void callback();

    };

     

    interface Callback

    {

        void initiateCallback(CallbackReceiver* proxy);

        void shutdown();

    };

     

    };

    服务器

    CallbackI

    void
    CallbackI::initiateCallback(const CallbackReceiverPrx& proxy, const Ice::Current& current)
    {
        proxy->callback();
    }
    
    void
    CallbackI::shutdown(const Ice::Current& c)
    {
        c.adapter->getCommunicator()->shutdown();
    }

    config.server

    #

    # The endpoint of the server's object adapter. This should be an

    # endpoint on an internal network (like 192.168.x.x), or on the

    # loopback, so that the server is not directly accessible from the

    # Internet.

    #

    Callback.Server.Endpoints=tcp -h localhost -p 10000

    Server.cpp

    int
    
    CallbackServer::run(int argc, char*[])
    
    {
    
        Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Callback.Server");
    
        CallbackPtr cb = new CallbackI;
    
        adapter->add(cb, communicator()->stringToIdentity("callback"));
    
        adapter->activate();
    
        communicator()->waitForShutdown();
    
    }

    客户端

    CallbackReceiverI

    void
    CallbackReceiverI::callback(const Ice::Current&)
    {
        cout << "received callback" << endl;
    }

    config.client

    #

    # The proxy to the Glacier2 router for all outgoing connections. This

    # must match the value of Glacier2.Client.Endpoints in config.glacier2.

    #

    Ice.Default.Router=DemoGlacier2/router:ssl -p 4064 -h localhost

     

    #

    # We don't need any endpoints for the client if we use a

    # router. Incoming requests are received through connections

    # established from the client to the router.

    #

    Callback.Client.Endpoints=

     

    #

    # This must match the value of Callback.Server.Endpoints in

    # config.server.

    #

    Callback.Proxy=callback:tcp -h localhost -p 10000

    Client.cpp

    Glacier2::SessionPrx
    CallbackClient::createSession()
    {
        Glacier2::SessionPrx session;
        cout << "This demo accepts any user-id / password combination.
    ";
        string id;
        string pw;
        session = router()->createSession(id, pw);
        return session;
    }
    
    int
    CallbackClient::runWithSession(int argc, char*[])
    {
        Ice::Identity callbackReceiverIdent = createCallbackIdentity("callbackReceiver");
        
        Ice::ObjectPrx base = communicator()->propertyToProxy("Callback.Proxy");
        CallbackPrx twoway = CallbackPrx::checkedCast(base);
        
        objectAdapter()->add(new CallbackReceiverI, callbackReceiverIdent);
        
        CallbackReceiverPrx twowayR = CallbackReceiverPrx::uncheckedCast(objectAdapter()->createProxy(callbackReceiverIdent));
        
        string override;
        
        char c;
        do
        {
            cin >> c;
            if(c == 't')
            {
                Ice::Context context;
                context["_fwd"] = "t";
                if(!override.empty())
                {
                    context["_ovrd"] = override;
                }
                twoway->initiateCallback(twowayR, context);
            }
            else if(c == 'v')
            {
                if(override.empty())
                {
                    override = "some_value";
                }
                else
                {
                    override.clear();
                }
            }
            else if(c == 's')
            {
                twoway->shutdown();
            }
        }
        while(1);
    }
  • 相关阅读:
    链表栈
    C# TCP应用编程二 同步TCP应用编程
    C# TCP应用编程一 概述
    C# 网络流
    远程连接 出现身份验证错误,要求的函数不受支持(这可能是由于CredSSP加密Oracle修正)
    C#线程Thread类
    C# 通过Internet搜索网络资源
    正则表达式
    C#文件的读写
    微服务实战
  • 原文地址:https://www.cnblogs.com/leaf-w/p/3791395.html
Copyright © 2011-2022 走看看