最近有个项目,大致需求是,服务端发送消息通知客户端上传指定的数据,然后处理后一部分显示在服务端界面上。也是在网上胡乱搜索一片,看到一篇Remoting广播事件的博客+Remoting觉得这么还可以做。

大致原理是:通过服务端广播事件,客户端通过调用远程类将数据以参数的方式传给服务端,然后激活服务端界面层的事件就达到双向了。都是靠远程类里的2个事件,一个给服务端,一个给客户端,分别交叉执行。这就相当于: 服务端界面--远程类--客户端界面,远程类起到了一个中间人的作用样,是吧?

 

先看看服务端封装的Remoting的类

 

public sealed class RemotingServer
    {
        HttpChannel tcpC;

        
public static RemotingObject.Remoter Obj = null;

        
static RemotingServer instance = new RemotingServer();

        
public static RemotingServer GetRemotingServer
        {
            
get { return instance; }
        }

        RemotingServer()
        {
            
//tcpC = new TcpChannel(9000);
            
        }

        
public void ServerTakeOn()
        {
            
//if (!ExistServer(tcpC.ChannelName))
            
//{
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotingObject.Remoter), "RemotingService", WellKnownObjectMode.Singleton);
                BinaryServerFormatterSinkProvider serverProvider 
= new BinaryServerFormatterSinkProvider();
                BinaryClientFormatterSinkProvider clientProvider 
= new BinaryClientFormatterSinkProvider();
                serverProvider.TypeFilterLevel 
= TypeFilterLevel.Full;
                IDictionary props 
= new Hashtable();
                props[
"port"= 9500;
                tcpC 
= new HttpChannel(props, clientProvider, serverProvider);
                ChannelServices.RegisterChannel(tcpC);

                Obj 
= new RemotingObject.Remoter();
                ObjRef objRef 
= RemotingServices.Marshal(Obj, "RemotingMessage.soap");
            
            
//}
        }

        
public void ServerTakeOff()
        {
            
if (ExistServer(tcpC.ChannelName))
            {
                tcpC.StopListening(
null);
                ChannelServices.UnregisterChannel(tcpC);
            }
        }

        
private bool ExistServer(string serverName)
        {
            
bool tmp_b = false;
            IChannel[] list 
= ChannelServices.RegisteredChannels;
            
foreach (IChannel ic in list)
            {
                HttpChannel tmp_tcp 
= (HttpChannel)ic;
                
if(tmp_tcp.ChannelName==serverName)
                {
                    tmp_b 
= true;
                    
break;
                }
            }
            
return tmp_b;
        }
    }

相关文章: