Remote建立分析
Remote作为一个远程调用对象技术,它有着.WebService没有的优势,首先它在一个企业内部系统使用的话,TCP通常就更好地发挥它的作用,当然它不跨平台这是一个不少的遗憾,下面是我对Remote的一点了解,有错误的地方大家指出来..
Remote通常分三步建立
1: RemoteObject(通常是类库文件)
2: RemoteServer(真正开发项目的时间建议用WINDOWS服务,调试的时候可以用控制台程序)
3: RemoteClient(也就是实现RemoteObject所定义的方法)
RemoteObject
(一):定義對象接口(如: interface ISenLin)
1:定義屬性
2:定義方法
3:其他
如:
(二):定義工廠接口(interface IMyFactory)作用:創建對象接口實例
1:定義返回接口實例的方法
2:其他
RemoteServer
(一):定義對象類並繼承MarshalByRefObject類和實現對象接口
如: public class SenLin:MarshalByRefObject,ISenLin
(二):定義工廠類並繼承MarshalByRefObject類和實現工廠接口
(注:通常上面两个是在RemoteObject中实现,只是当初为了表示更好的理解而在这里实现
)
如: public class ServerFactory:MarshalByRefObject,IMyFactory
(三):注冊通道
如: TcpChannel chan = new
TcpChannel(7777);
HttpChannel chan2 = new HttpChannel(8888);
(四):注冊對象(即工廠類ServerFactory)
如: RemotingConfiguration.RegisterWellKnownServiceType(typeof(ServerFactory),
"senlin", WellKnownObjectMode.SingleCall);
RemoteClient
(一):注冊通道
如: TcpChannel chan = new
TcpChannel();
HttpChannel
chan2 = new HttpChannel();
(二): 客戶端激活
1: 激活創建工廠接口對象
2: 通過工廠對象接口的實例方法返回對象接口實例
如:IMyFactory imyf = (IMyFactory)Activator.GetObject(typeof(IMyFactory), "tcp://localhost:7777/longkc");
ISenLin isen =
imyf.GetSenLin();
(三): 通過對象接口的實例可以實現對象接口所定義的方法和屬性等
總結:
1在OBJECT中定義工廠接口和對象接口
2:在SERVER中定義工廠類實現工廠接口,定義對象類實理對象接口, 注冊對象(即工廠類)
3:在CLIENT 中激活工廠接口,創建對象接口, 用對象接口實現定義的屬性和方法
完整代碼
RemoteObject
ISenLin.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace RemoteObject
{
public interface
ISenLin
{
string Depart
{ get; set;}
string Position
{ get; set;}
string Address
{ get; set;}
string Name
{ get; set;}
string GetDeatailAddress();
}
}
IMyService.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace RemoteObject
{
public interface
IMyService
{
int Age
{ get; set;}
string Name
{ get; set;}
string Address
{ get; set;}
string GetMyName();
string GetMyAddress();
}
}
IMyFactory.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace RemoteObject
{
public interface
IMyFactory
{
IMyService GetsService();
ISenLin GetSenLin();
}
}
RemoteServer
ServerFactory.cs
using System;
using System.Collections.Generic;
using System.Text;
using RemoteObject;
namespace RemoteServer
{
public class
ServerFactory:MarshalByRefObject,IMyFactory
{
#region IMyFactory Members
public IMyService
GetsService()
{
return new ServerImpl();
}
public ISenLin
GetSenLin()
{
return
new SenLin();
}
#endregion
}
}
SenLin.cs
using System;
using System.Collections.Generic;
using System.Text;
using RemoteObject;
namespace RemoteServer
{
public class
SenLin:MarshalByRefObject,ISenLin
{
private string
depart;
private string
name;
private string
address;
private string
position;
#region ISenLin Members
public string
Address
{
get
{
return
address;
}
set
{
address = value;
}
}
public string
Depart
{
get
{
return depart;
}
set
{
depart = value;
}
}
public string
Name
{
get
{
return
name;
}
set
{
name = value;
}
}
public string
Position
{
get
{
return
position;
}
set
{
position = value;
}
}
public string
GetDeatailAddress()
{
return
"招聘職位:" + Position + " 詳細地址: " + Address + Name;
}
#endregion
}
}
ServerImpl.cs
using System;
using System.Collections.Generic;
using System.Text;
using RemoteObject;
namespace RemoteServer
{
public class ServerImpl:MarshalByRefObject,IMyService
{
private int
age;
private string
name;
private string
address;
#region IMyService Members
public string
Address
{
get
{
return
address;
}
set
{
address = value;
}
}
public int
Age
{
get
{
return
age;
}
set
{
age = value;
}
}
public string
GetMyAddress()
{
return
"我的地址是: " + Address;
}
public string
GetMyName()
{
return
"我的名字叫: " + Name;
}
public string
Name
{
get
{
return
name;
}
set
{
name = value;
}
}
#endregion
}
}
Program.cs控制台程序
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteObject;
namespace RemoteServer
{
class Program
{
static void
{
TcpChannel
chan = new TcpChannel(7777);
HttpChannel
chan2 = new HttpChannel(8888);
ChannelServices.RegisterChannel(chan,
false);
ChannelServices.RegisterChannel(chan2,
false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ServerFactory),
"longkc", WellKnownObjectMode.SingleCall);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ServerFactory),
"senlin", WellKnownObjectMode.SingleCall);
System.Console.WriteLine("Press Any Key to Exit ! ");
System.Console.ReadLine();
}
}
}
RemoteClient
Program.cs
控制台程序
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Activation;
using RemoteObject;
namespace RemoteClient
{
class Program
{
static void
{
//注冊通道
TcpChannel
chan = new TcpChannel();
HttpChannel
chan2 = new HttpChannel();
ChannelServices.RegisterChannel(chan,
false);
ChannelServices.RegisterChannel(chan2,
false);
//仿客戶端端激活方式
//激活創建工廠接口對象
IMyFactory imyf = (IMyFactory)Activator.GetObject(typeof(IMyFactory), "tcp://localhost:7777/longkc");
//通過工廠對象接口的實例方法返回對象接口實例
IMyService imy = imyf.GetsService();
ISenLin
isen = imyf.GetSenLin();
//客戶端激活方式
//object[]
attrs = { new UrlAttribute("http://localhost:9999/Pur") };
//object[]
param = { };
//PurClass
pur = (PurClass)Activator.CreateInstance(typeof(PurClass), null, attrs);
//imy.Name
= "LONGKAGNCAI";
if
(imy == null)
Console.WriteLine("無法定位服務器!");
else
{
serverObj.Name = "國營農場";
imy.Age = 27;
imy.Name = "李小明";
imy.Address = "東莞市";
isen.Address = "東莞市";
isen.Depart = "電腦部";
isen.Position = "軟件工程師";
isen.Name = "東莞市紡織有限公司";
Console.WriteLine(imy.GetMyName());
Console.WriteLine(imy.Age);
Console.WriteLine(imy.GetMyAddress());
Console.WriteLine(isen.GetDeatailAddress());
}
Console.WriteLine();
Console.ReadLine();
}
}
}