Remoting服务实例
由于最近开始接触Remoting项目,所以特意学习了一下,写了一篇简要的实例分享,加深一遍对Remoting服务框架的理解,个人觉得它的原理就是分布式的调用远程主机上的类库,在不同机器上的应用程序域之间建立通道,使用可序列化的远程对象传递数据。
1. 远程对象代码
public class HelloData:MarshalByRefObject
{
/// <summary>
/// 服务名称
/// </summary>
public static string ObjectURI { get { return "HellURI"; } }
/// <summary>
/// 给客户端调用的接口
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public string Greeting(string name)
{
return "您好!" + DateTime.Now.ToLongTimeString();
}
/*创建发送消息委托*/
public delegate void SendMessageHandler(string messge);
/*创建发送消息事件*/
public static event SendMessageHandler SendMessageEvent;
/*发送消息*/
public void SendMessage(string messge)
{
if (SendMessageEvent != null)
SendMessageEvent("Client Send"+messge);
}
}
2. 服务端代码
static void Main(string[] args)
{
bool isStart = false;
bool isStop = false;
Console.WriteLine("Server,Please input num: 1(start),2(stop)");
while (true)
{
string inputStr = Console.ReadLine();
if (inputStr == "1")
{
if (!isStart)
{
isStart = true;
isStop = false;
//创建通信侦听通道对象
TcpServerChannel channel = new TcpServerChannel("HelloChannel",8086);
//注册通信侦听通道
ChannelServices.RegisterChannel(channel, true);
//注册对象URI, 注册远程对象
RemotingConfiguration.RegisterWellKnownServiceType(typeof(HelloData), HelloData.ObjectURI, WellKnownObjectMode.SingleCall);
/*接收客户端事件*/
HelloData.SendMessageEvent += new HelloData.SendMessageHandler(ServerSendMessageEvent);
Console.WriteLine("服务器已启动!");
}
}
else
{
if (!isStop)
{
isStart = false;
isStop = true;
IChannel[] channels = ChannelServices.RegisteredChannels;
//关闭指定名为MyTcp的通道;
foreach (IChannel eachChannel in channels)
{
if (eachChannel.ChannelName == "HelloChannel")
{
TcpChannel tcpChannel = (TcpChannel)eachChannel;
//关闭监听;
tcpChannel.StopListening(null);
//注销通道;
ChannelServices.UnregisterChannel(tcpChannel);
}
}
}
}
}
}
static void ServerSendMessageEvent(string messge)
{
Console.WriteLine(messge);
}
3. 客户端代码
static void Main(string[] args)
{
Console.WriteLine("Client,Please input num: 1(Connect),2(DisConnect)");
string inputStr = Console.ReadLine();
if(inputStr=="1")
{
//注册客户端通信通道
ChannelServices.RegisterChannel(new TcpClientChannel(), true);
try
{
HelloData obj = (HelloData)Activator.GetObject(typeof(HelloData),"tcp://localhost:8086/" + HelloData.ObjectURI);
if (obj == null)
{
Console.WriteLine("找不到服务器!");
return;
}
while (true)
{
string returnStr = obj.Greeting(" Server Return String! ");
Console.WriteLine(returnStr);
obj.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString());
Console.WriteLine("send message...");
Thread.Sleep(500);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Console.ReadLine();
}