C# .net Remoting最简单的例子
C# .net Remoting最简单的例子
服务端:
using System;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
//在引用中添加
namespace RemotingTest
{
class Program
{
static void Main(string[] args)
{
try
{
TcpServerChannel server = new TcpServerChannel(4567); //端口
ChannelServices.RegisterChannel(server, false); //注册通道
//客户端每次请求, Singleton是同用一个实例, singlecall是用各个实例
//Singleton和SingleCall都是服务端激活模式(WellKnown模式), 另外还有两种客户端激活模式
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotingObj.PictureInfo), "MyRemotingService", WellKnownObjectMode.Singleton);
Console.WriteLine("服务正常启动");
}
catch (Exception ex) { Console.WriteLine(ex.ToString() + "失败了!"); }
while (true) { }
}
}
}
//remoting, webservice传送的对像都要新建一个命名空间
//这个可以生成一个dll 在服务和客户端都引用
namespace RemotingObj
{
//[Serializable]只调用方法时可写可不写, 传送对像时要写
public class PictureInfo : MarshalByRefObject
{
public string GetPicinfo(string strName)
{
return "已返回[" + strName + "]的信息";
}
////SingleCall启动例子要重写InitializeLifetimeService函数,
////return null可以使各个实例一直存在 多用在聊天室客户端与服务端相连
//public override object InitializeLifetimeService()
//{
// return null;
//}
}
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
//在引用中添加
namespace RemotingTest
{
class Program
{
static void Main(string[] args)
{
try
{
TcpServerChannel server = new TcpServerChannel(4567); //端口
ChannelServices.RegisterChannel(server, false); //注册通道
//客户端每次请求, Singleton是同用一个实例, singlecall是用各个实例
//Singleton和SingleCall都是服务端激活模式(WellKnown模式), 另外还有两种客户端激活模式
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotingObj.PictureInfo), "MyRemotingService", WellKnownObjectMode.Singleton);
Console.WriteLine("服务正常启动");
}
catch (Exception ex) { Console.WriteLine(ex.ToString() + "失败了!"); }
while (true) { }
}
}
}
//remoting, webservice传送的对像都要新建一个命名空间
//这个可以生成一个dll 在服务和客户端都引用
namespace RemotingObj
{
//[Serializable]只调用方法时可写可不写, 传送对像时要写
public class PictureInfo : MarshalByRefObject
{
public string GetPicinfo(string strName)
{
return "已返回[" + strName + "]的信息";
}
////SingleCall启动例子要重写InitializeLifetimeService函数,
////return null可以使各个实例一直存在 多用在聊天室客户端与服务端相连
//public override object InitializeLifetimeService()
//{
// return null;
//}
}
}
客户端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace Client
{
class Program
{
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpClientChannel(), false); //注册通道
string strRemoteAddress = @"tcp://localhost:4567/MyRemotingService";
RemotingObj.PictureInfo pic = (RemotingObj.PictureInfo)Activator.GetObject(typeof(RemotingObj.PictureInfo), strRemoteAddress);
string str = pic.GetPicinfo("Mypic");
Console.WriteLine("Remoting连结成功...\n" + str);
Console.ReadKey();
}
}
}
namespace RemotingObj
{
public class PictureInfo : MarshalByRefObject
{
public string GetPicinfo(string strName)
{
return "";
}
}
}
using System.Linq;
using System.Text;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace Client
{
class Program
{
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new TcpClientChannel(), false); //注册通道
string strRemoteAddress = @"tcp://localhost:4567/MyRemotingService";
RemotingObj.PictureInfo pic = (RemotingObj.PictureInfo)Activator.GetObject(typeof(RemotingObj.PictureInfo), strRemoteAddress);
string str = pic.GetPicinfo("Mypic");
Console.WriteLine("Remoting连结成功...\n" + str);
Console.ReadKey();
}
}
}
namespace RemotingObj
{
public class PictureInfo : MarshalByRefObject
{
public string GetPicinfo(string strName)
{
return "";
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义