栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

C# Remoting理解

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C# Remoting理解

问题:命名空间“System.Runtime.Remoting.Channels”中不存在类型或命名空间名“Tcp”(是否缺少程序集引用?) 

解决:项目->添加引用->程序集->选中System.Runtime.Remoting

remmoting:实现进程间通讯,主要是获取远程对象,实际的通讯是通过TCP

实现的流程:

先定义一个继承了MarshalByRefObject 的类,该类是在支持远程处理的应用程序中,允许跨应用程序域边界访问对象

1.定义信道

服务器: TcpServerChannel channels = new TcpServerChannel("TalkChannel", 9000);

TcpServerChannel (string name, int port)

name:信道名称

port:信道监听端口

客户端: TcpClientChannel channel = new TcpClientChannel();

2.注册信道

ChannelServices.RegisterChannel(channel, true);

3.服务器:注册远程对象模型

 RemotingConfiguration.RegisterWellKnownServiceType(typeof(Talker), "Talker", WellKnownObjectMode.SingleCall);

typeof(Talker):对象Type

"Talker":对象URI

WellKnownObjectMode.SingleCall:正在被注册的已知对象类型的激活方式 (SingleCall每个传入的消息由新的对象实例提供服务,Singleton每个传入的消息由同一个对象实例提供服务。)

客户端:获取远程对象(Talker)Activator.GetObject(typeof(Talker),"TCP://localhost:9000/Talker");MarshalByRefObject的子类对象

typeof(Talker):希望连接到的已知对象的类型

"TCP://localhost:9000/Talker":已知的URL

具体实现的代码:

MarshalByRefObject的子类

class Talker : MarshalByRefObject
    {
        public void SendMsg(string text)
        {
            System.Console.WriteLine(text);
        }
    }

服务器端代码:

class Program
    {
        static void Main(string[] args)
        {
            //注册通道
            TcpServerChannel channels = new TcpServerChannel("TalkChannel", 9000);
            ChannelServices.RegisterChannel(channels, true);

            //注册远程对象
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(Talker), "Talker", WellKnownObjectMode.SingleCall);

            Console.ReadLine();
        }
    }

客户端代码:客户端是一个winform程序,包含一个button,一个textBox

public partial class Form1 : Form
    {
        private Talker talker;
        public Form1()
        {
            InitializeComponent();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            try
            {
                //操作远程对象
                talker.SendMsg(txtBoxMsg.Text);
                MessageBox.Show("发送成功:" + txtBoxMsg.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //注册通道
            TcpClientChannel channel = new TcpClientChannel();
            ChannelServices.RegisterChannel(channel, true);

            //获取远程对象
            talker = (Talker)Activator.GetObject(typeof(Talker),"TCP://localhost:9000/Talker");
         }
    }

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954941.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号