Remoting服务实例

dahlin
8
2020-03-10

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();
}

4. 参考资料

动物装饰