.

远程调用

1. 创建一个远程的可序列化的类,这个类可以在远程调用中用于传输来去,似乎是个公共的类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Remoting.Metadata; namespace MessageMarshal
{ /*创建发送消息委托*/
public delegate void SendMessageHandler(string messge);
[Serializable]
public class TestMessageMarshal : MarshalByRefObject
{
private Guid ID { get; set; }
/*新建对象实例时重新创建标识编号*/
public TestMessageMarshal()
{
ID = Guid.NewGuid();
} public static event SendMessageHandler SendMessageEvent; // [SoapMethod(XmlNamespace = "MessageMarshal", SoapAction = "MessageMarshal#SendMessage")]
public void SendMessage(string messge)
{
if (SendMessageEvent != null)
SendMessageEvent(ID.ToString() + "\t" + messge);
}
} }

  

2. 创建服务器的类:

using MessageMarshal;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Ipc;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace ServerApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); } private void Form1_Load(object sender, EventArgs e)
{
TestStartServer();
} void TestStartServer() { /*创建HTTP通道*/
IpcChannel channel = new IpcChannel("test");//或者 IpcServerChannel serverChannel = new IpcServerChannel("test"); /*注册通道服务端*/
ChannelServices.RegisterChannel(channel, false);
/*设置模式为 Singleton */
RemotingConfiguration.RegisterWellKnownServiceType(typeof(TestMessageMarshal), "MessageMarshal.TestMessageMarshal", WellKnownObjectMode.SingleCall);
txtLog.AppendText("started ..." + "\r\n");
/*接收客户端事件*/
TestMessageMarshal.SendMessageEvent += new SendMessageHandler(TestMessageMarshal_SendMessageEvent);
Console.Read();
} void TestMessageMarshal_SendMessageEvent(string messge)
{
txtLog.AppendText(messge+"\r\n");
} }
}

  

3. 创建客户端类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MessageMarshal;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Threading;
using System.Runtime.Remoting.Channels.Ipc; namespace GPRemoteClient
{
class Program
{
static void Main(string[] args)
{
IpcChannel channel = new IpcChannel();//或者IpcClientChannel channel = new IpcClientChannel("channel2", new BinaryClientFormatterSinkProvider());
            ChannelServices.RegisterChannel(channel, false);
var testMessageMarshal = (TestMessageMarshal)Activator.GetObject(typeof(MessageMarshal.TestMessageMarshal), "ipc://test/MessageMarshal.TestMessageMarshal");
while (true)
{
testMessageMarshal.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString());
Console.WriteLine("send message...");
Thread.Sleep(2000);
} /*或者下面的代码也可实现这个远程调用效果
IpcChannel channel = new IpcChannel();
ChannelServices.RegisterChannel(channel, false);
//注册通道 的 远程处理类型
RemotingConfiguration.RegisterWellKnownClientType(typeof(MessageMarshal.TestMessageMarshal), "ipc://test/MessageMarshal.TestMessageMarshal");
//创建消息实体
MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal();
while (true)
{
TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString());
Console.WriteLine("send message...");
Thread.Sleep(2000);
}
*/
}
}
}

  

原理的 这个 类TestMessageMarshal : MarshalByRefObject 是继承了MarshalByRefObject ,简单来讲,继承此类的对象可以跨越应用程序域边界被引用,甚至被远程引用.

如果在同一个项目进程里测试 创建服务端和客户端Channel或报 已经注册了某个Channel的错误。因为channel默认名字的原因。

这个时候可以用形如下的方式创建服务端和客户端Channel:

IpcServerChannel serverChannel = new IpcServerChannel("test");
IpcClientChannel channel = new IpcClientChannel("channel2", new BinaryClientFormatterSinkProvider());

还加不同的参数来创建可以如:

Hashtable ht = new Hashtable();
ht["portName"] = "TestChannel";
ht["name"] = "ipc";
ht["authorizedGroup"] = "Everyone";//可设置权限。
IpcChannel channel = new IpcChannel(ht,null,null);

c# 远程调用 / Remoting IpcChannel sample的更多相关文章

  1. 在Dubbo中开发REST风格的远程调用(RESTful Remoting)

    rest 在Dubbo中开发REST风格的远程调用(RESTful Remoting)

  2. 【Rest】在Dubbo中开发REST风格的远程调用(RESTful Remoting)

    目录 概述 REST的优点 应用场景 快速入门 标准Java REST API:JAX-RS简介 REST服务提供端详解 HTTP POST/GET的实现 Annotation放在接口类还是实现类 J ...

  3. 【Java EE 学习 78 中】【数据采集系统第十天】【Spring远程调用】

    一.远程调用概述 1.远程调用的定义 在一个程序中就像调用本地中的方法一样调用另外一个远程程序中的方法,但是整个过程对本地完全透明,这就是远程调用.spring已经能够非常成熟的完成该项功能了. 2. ...

  4. 深入浅出Alljoyn——实例分析之远程调用(Method)篇

    深入浅出就是很深入的学习了很久,还是只学了毛皮,呵呵! 服务端完整代码: #include <qcc/platform.h> #include <assert.h> #incl ...

  5. .Net组件程序设计之远程调用(二)

    .Net组件程序设计之远程调用(二) 激活模式 引用封送对象激活类型两种, 一种是客户端激活类型,一种是服务器端激活. 客户端激活对象 客户端激活方式:当客户端创建一个远程对象时,客户端得到的是一个新 ...

  6. .Net组件程序设计之远程调用(一)

    .Net组件程序设计之远程调用(一) 1应用程序域 我们知道我们写的C#代码是在操作系统逻辑体系结构中最上层的,然而操作系统本身是不会认识C#代码的,它只认识机器代码.那我们写的程序经过编译后是编译成 ...

  7. Spring远程调用技术<3>-Spring的HTTP Invoker

    前面提到RMI使用java标准的对象序列化机制,但是很难穿透防火墙.  另一方面,Hessian和Burlap能很好地穿透防火墙,但是使用私有的对象序列化机制. Spring提供的http invke ...

  8. Spring远程调用技术<2>-Hessian和Burlap

    上篇谈到RMI技术,加上Spring的封装,用起来很方便,但也有一些限制 这里的Hessian和Burlap解决了上篇提到的限制,因为他们是基于http的轻量级远程服务. Hessian,和RMI一样 ...

  9. Spring远程调用技术<1>-RMI

    在java中,我们有多种可以使用的远程调用技术 1.远程方法调用(remote method invocation, RMI)  适用场景:不考虑网络限制时(例如防火墙),访问/发布基于java的服务 ...

  10. Hessian怎样实现远程调用

    1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持. Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实 ...

随机推荐

  1. Xshell终端连接服务器慢,问题解决方法

    Xshell连接慢的话,先在xshell中设置中点隧道然后把转发xshell的勾取消 /etc/ssh/sshd_config 里边修改第115行UseDNS把注释取消然后yes改为no 然后重启ss ...

  2. 2023NOIP A层联测9 风信子+P2048 【NOI2010】 超级钢琴 2023

    P2048 [NOI2010] 超级钢琴 2023NOIP A层联测9 风信子 一年 OI 一场空,一道原题见祖宗-- Ps:超级钢琴是风信子的前置题. 超级钢琴 题意 在一段序列上,选择长度为 \( ...

  3. linux history 想显示历史命令的时间和作者

    vi ~/.profile 增加 HISTTIMEFORMAT="%F %T `whoami` `who am i|awk '{print $1,$5}'|sed 's/ (/@/'|sed ...

  4. 解码OutOfMemoryError:PermGen Space

    本文由 ImportNew - Peter Pan 翻译自 javacodegeeks.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加 ...

  5. UML 基础:类图

    这是关于统一建模语言.即UML 里采用的基本图的一系列文章的一部分.在我 先前关于序列图的文章 里,我把重点从 UML 1.4 版,转移到 OMG的采用UML 2.0版草案规范(又称为UML 2).在 ...

  6. Element-Plus表格:Table自定义合并行数据的最佳实践

    " 知行合一 " -- 王阳明 在开发项目中,我们时常会用到表格,许多需求可能会要求自定义特定的行或列. 接下来,我们将探讨在实际开发中如何应对这一挑战. 本文案例采用的技术: 名 ...

  7. 使用 JsonSchema 校验 JSON数据

    有时候JSON 数据格式需要校验是否合法,我们可以使用 JsonSchema 来校验数据是否合法. 引入 pom.xml https://json-schema.org/ <dependency ...

  8. mongoose 读取表中数据始终返回空值

    在项目中使用MongoDB存取数据,在另一个项目中使用mongoose读取同一数据库中表数据却始终返回空值. 后发现mongoose在创建model时会自动添加"s",而Mongo ...

  9. 【Amadeus原创】群晖关闭局域网发现

    套件中心-媒体服务器,卸载.

  10. 中电金信:源启混沌工程平台(V4)与东方通TongwebV7.0完成适配认证

    ​近日,源启混沌工程平台(V4)与北京东方通科技股份有限公司(以下简称东方通)应用服务器软件东方通TongwebV7.0完成产品兼容互认证,通过在产品功能.性能.兼容性方面的全面严格测试,得出结论:东 ...