先弄清一下流程吧:
1>定义远程对象(继承自MarshalByRefObject)
2>创建一个Server端作为宿主(注册通道、注册远程对象)
3>创建客户端(注册通道、通过URL获取Server端的远程对象的代理、通过代理操作远程对象)
服务器IP:10.10.1.35 端口号:8090
如果使用的端口号已经被占用会提示:
具体操作代码:
1.创建一个操作具体的项目RemotingModel
namespace RemotingModel { //记得把类的访问修饰符改为public public class Talker : MarshalByRefObject//继承自该MarshalByRefObject { public void Talk(string word) { Console.WriteLine(word); } } }
2.添加一个服务器端项目RemotingServer:这个项目在服务器端10.10.1.35机器上
1>添加引用System.Runtime.Remoting和RemotingModel项目
2>添加如下代码:
using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using RemotingModel;
static void Main(string[] args) { //注册通道(添加引用RemotingModel和System.Runtime.Remoting) TcpServerChannel channel = new TcpServerChannel("TalkChannel", 8090); ChannelServices.RegisterChannel(channel, false); //注册远程对象 RemotingConfiguration.RegisterWellKnownServiceType(typeof(Talker), "Ser_Talker", WellKnownObjectMode.SingleCall ); Console.ReadLine(); }
3.添加一个客户端项目RemotingClient:这个项目在客户端机器上
同样添加那两引用
using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using RemotingModel; namespace RemotingClient { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private Talker _talker = null; private void button1_Click(object sender, EventArgs e) { //操作远程对象 _talker.Talk(txt_word.Text.Trim()); //Do other things txt_content.Text = "发送成功:" + txt_word.Text.Trim(); } private void Form1_Load(object sender, EventArgs e) { //注册通道 TcpClientChannel channel = new TcpClientChannel(); ChannelServices.RegisterChannel(channel, false); //获取远程对象 _talker = (Talker)Activator.GetObject(typeof(Talker), "TCP://10.10.1.35:80/Ser_Talker");//TCP://10.10.1.35:8090/Ser_Talker } } }
注意:如果客户端和服务器端ChannelServices.RegisterChannel(channel, true);这里是true的时候会报错:
如果端口号写的不一致就会出现如下错误:
当然如果客户端和服务器端都在本机上运行的时候这里的true也可以的。
生成之后你直接在服务器端和客户端下打开bin>Debug>文件夹下的.exe就可以实现效果了。
这样的话就ok了你在本机上发的消息马上就能在服务器10.10.1.35上看到消息了。