最近有个项目,大致需求是,服务端发送消息通知客户端上传指定的数据,然后处理后一部分显示在服务端界面上。也是在网上胡乱搜索一片,看到一篇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;
}
}
{
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;
}
}