remoting教学三:remoting的远程对象
远程对象还是本地对象
我们修改程序,看Person这个类的对象是从客户端生成的,还是服务器端生成。
RemoteObject
using System;
namespace RemoteObject
{
public class MyObject : MarshalByRefObject
{
private int i = 0;
public int Add(int a, int b)
{
return a + b;
}
public int Count()
{
return ++i;
}
public Person getOnePerson()
{
System.Console.WriteLine(".........");
return new Person();
}
public void SaveOnePerson(Person p)
{
System.Console.WriteLine(p.Name + " is saved!");
}
}
[Serializable]
public class Person
{
private string name="ddddddfault";
public Person()
{
System.Console.WriteLine("person create");
}
public string Name
{
get { return name; }
set { name = value; }
}
}
}
namespace RemoteObject
{
public class MyObject : MarshalByRefObject
{
private int i = 0;
public int Add(int a, int b)
{
return a + b;
}
public int Count()
{
return ++i;
}
public Person getOnePerson()
{
System.Console.WriteLine(".........");
return new Person();
}
public void SaveOnePerson(Person p)
{
System.Console.WriteLine(p.Name + " is saved!");
}
}
[Serializable]
public class Person
{
private string name="ddddddfault";
public Person()
{
System.Console.WriteLine("person create");
}
public string Name
{
get { return name; }
set { name = value; }
}
}
}
server:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemoteServer
{
class MyServer
{
[STAThread]
static void Main(string[] args)
{
TcpServerChannel channel = new TcpServerChannel(9999);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.MyObject),
"RemoteObject", WellKnownObjectMode.Singleton);
System.Console.WriteLine("Press Any Key");
System.Console.ReadLine();
}
}
}
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemoteServer
{
class MyServer
{
[STAThread]
static void Main(string[] args)
{
TcpServerChannel channel = new TcpServerChannel(9999);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.MyObject),
"RemoteObject", WellKnownObjectMode.Singleton);
System.Console.WriteLine("Press Any Key");
System.Console.ReadLine();
}
}
}
client:
using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemoteClient
{
class MyClient
{
[STAThread]
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpClientChannel());
RemoteObject.MyObject remoteobj = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),
"tcp://localhost:9999/RemoteObject");
Console.WriteLine("1 + 2 = " + remoteobj.Add(1, 2).ToString());
Console.WriteLine("i = " + remoteobj.Count().ToString());
RemoteObject.Person r = new RemoteObject.Person();
r.Name = Guid.NewGuid().ToString();
Console.WriteLine("Name = " + r.Name);
remoteobj.SaveOnePerson(r);
Console.ReadLine();
}
}
}
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemoteClient
{
class MyClient
{
[STAThread]
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpClientChannel());
RemoteObject.MyObject remoteobj = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),
"tcp://localhost:9999/RemoteObject");
Console.WriteLine("1 + 2 = " + remoteobj.Add(1, 2).ToString());
Console.WriteLine("i = " + remoteobj.Count().ToString());
RemoteObject.Person r = new RemoteObject.Person();
r.Name = Guid.NewGuid().ToString();
Console.WriteLine("Name = " + r.Name);
remoteobj.SaveOnePerson(r);
Console.ReadLine();
}
}
}
注意,可以看到,如果在客户端调用的是getOnePerson()的,是从服务器创建对象,然后再传送到客户端。如果是在客户端 new RemoteObject.Person()的,则是在客户端创建对象,然后通过 SaveOnePerson()保存到服务器上。