.NET Remoting 入门实例

1.创建服务端Class:ProxyServerRemoting


 1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using Inscription.Manadal.EmrPlugIn.NetMessage;
5 using NLog;
6 using Inscription.Manadal.EmrPlugIn;
7 using System.ComponentModel;
8 using System.Runtime.Remoting;
9 using System.Runtime.Remoting.Channels.Tcp;
10 using System.Runtime.Remoting.Channels;
11
12 namespace Inscription.Mandala.EmrPlugIn.ProxyServer
13 {
14 public class ProxyServerRemoting
15 {
16 // 监听端口
17 private static int port;
18 // 单例对象
19 private static ProxyServerRemoting Instance = null;
20 // 后台工作线程对象
21 private BackgroundWorker backWork = null;
22 //定义服务端监听信道
23 private static TcpServerChannel tcpServerChannel = null;
24
25 private ProxyServerRemoting()
26 {
27 //创建后台工作对象(线程)
28 backWork = new BackgroundWorker();
29 //绑定DoWork事件程序
30 backWork.DoWork += new DoWorkEventHandler(backWork_DoWork);
31 //开始执行后台操作
32 backWork.RunWorkerAsync();
33 }
34
35 /// <summary>
36 /// 后台线程
37 /// </summary>
38 /// <param name="sender"></param>
39 /// <param name="e"></param>
40 private void backWork_DoWork(object sender, DoWorkEventArgs e)
41 {
42 StartServer();
43 }
44
45 /// <summary>
46 /// 单例实现
47 /// </summary>
48 /// <returns></returns>
49 public static ProxyServerRemoting getInstance(int Port)
50 {
51 if (Instance == null)
52 {
53 Instance = new ProxyServerRemoting();
54 tcpServerChannel = new TcpServerChannel(port);
55 port = Port;
56 }
57 return Instance;
58 }
59
60 /// <summary>
61 /// 启动服务
62 /// </summary>
63 public void StartServer()
64 {
65 ChannelServices.RegisterChannel(tcpServerChannel, false);
66
67 RemotingConfiguration.RegisterWellKnownServiceType(typeof(epiManagerV2), "GetEmrPlugInFunctionV3", WellKnownObjectMode.Singleton);
68 }
69
70 /// <summary>
71 /// 停止服务
72 /// </summary>
73 public void StopServer()
74 {
75 ChannelServices.UnregisterChannel(tcpServerChannel);
76 }
77 }
78 }

2.创建客户端调用Class:ProxyClient

客户端每次调用完成以后,需要注销掉当前信道,ChannelServices.UnregisterChannel(tcpChannel);

不然会发生异常:信道tcp已注册


using System;
using System.Collections.Generic;
using System.Text;
using NLog;
using System.Runtime.Remoting.Channels.Tcp;
using System.Diagnostics;
using System.Configuration;
using System.Reflection;
using System.Runtime.Remoting.Channels;
using Inscription.Manadal.EmrPlugIn;

namespace Inscription.Mandala.EmrPlugIn.ProxyClient
{
public static class ProxyClient
{
/// <summary>
/// 获取基于函数的外部接口
/// </summary>
/// <param name="MainName"></param>
/// <param name="ConfigInfo"></param>
/// <param name="worker"></param>
/// <param name="patientIndex"></param>
/// <returns></returns>
public static string GetEmrPlugInFunctionV3(string MainName, string ConfigInfo, string strWorker, string strPatientIndex, string CommandKey, string strParamLst)
{
TcpChannel tcpChannel = null;
Logger logger = NLogManagerV2.GetLogger("GetEmrPlugInFunctionV3_Client");
try
{
logger.Trace("判断服务端进程是否存在");

string strAppName = "IMPIProxyServer";
Process[] curProcesses = Process.GetProcesses();
bool isExist = false;
foreach (Process p in curProcesses)
{
if (p.ProcessName == strAppName)
{
isExist = true;
logger.Trace("服务端进程存在");
break;
}
}
if (isExist == false)
{
logger.Trace("服务端进程不存在");
Process.Start(strAppName);
logger.Trace("重新启动服务端进程");
}

//int port = 3399;
string ip = ConfigurationManager.AppSettings["ServerIP"];
int port = Convert.ToInt32(ConfigurationManager.AppSettings["ServerPort"]);
logger.Trace("监听IP:" + ip + " 监听端口" + port);

//使用TCP通道得到远程对象
tcpChannel = new TcpChannel();
ChannelServices.RegisterChannel(tcpChannel, false);
IepiManagerV2 manager = (IepiManagerV2)Activator.GetObject(typeof(IepiManagerV2), string.Format("tcp://{0}:{1}/GetEmrPlugInFunctionV3", ip, port));
logger.Trace("取得.Net Remoting对象成功");

string strReturn = manager.GetEmrPlugInFunctionV3(MainName, ConfigInfo, strWorker, strPatientIndex, CommandKey, strParamLst);
logger.Trace("客户端调用结束");
return strReturn;
}
catch (Exception ex)
{
logger.Trace(ex.Message);
return string.Empty;
}
finally
{
ChannelServices.UnregisterChannel(tcpChannel);
}
}
}
}

3.业务类:epiManagerV2

业务类实现了IepiManagerV2接口,其中客户端也链接引用了IepiManagerV2接口文件,这样客户端就摆脱了对具体业务Dll的依赖,

客户端编译成一个单独的dll可被第三方程序调用。


public class epiManagerV2 :  MarshalByRefObject,IepiManagerV2
{
/// <summary>
/// 获取基于函数的外部接口
/// </summary>
/// <param name="MainName"></param>
/// <param name="ConfigInfo"></param>
/// <param name="worker"></param>
/// <param name="patientIndex"></param>
/// <returns></returns>
public string GetEmrPlugInFunctionV3(string MainName, string ConfigInfo, string strWorker, string strPatientIndex, string CommandKey, string strParamLst)
{
实现略
}
}

IepiManagerV2接口类


using System;
namespace Inscription.Manadal.EmrPlugIn
{
interface IepiManagerV2
{
string GetEmrPlugInFunctionV3(string MainName, string ConfigInfo, string strWorker, string strPatientIndex, string CommandKey, string strParamLst);
}
}

4.服务端管理工具

实现启动服务,暂停服务,开机自动运行功能


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Configuration;
using Microsoft.Win32;
using System.IO;

namespace Inscription.Mandala.EmrPlugIn.ProxyServer
{
public partial class frmMainServer : Form
{
private ProxyServerRemoting Instance = null;

string ip = "127.0.0.1";
int port = 3399;

public frmMainServer()
{
InitializeComponent();
}

/// <summary>
/// 初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmMain_Load(object sender, EventArgs e)
{
InitForm();
StartServer();
}

private void InitForm()
{
this.ip = ConfigurationManager.AppSettings["ServerIp"];
this.port = Convert.ToInt32(ConfigurationManager.AppSettings["ServerPort"]);
}

/// <summary>
/// 打开服务端
/// </summary>
private void StartServer()
{
try
{
Instance = ProxyServerRemoting.getInstance(port);
Instance.StartServer();

btnStart.Enabled = false;
btnStop.Enabled = true;
lblStatus.Text = "服务正在运行";
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

/// <summary>
/// 关闭服务
/// </summary>
private void StopServer()
{
try
{
Instance.StopServer();

btnStart.Enabled = true;
btnStop.Enabled = false;
lblStatus.Text = "服务已关闭";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

/// <summary>
/// 窗口显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmMainServer_Shown(object sender, EventArgs e)
{
this.Hide();
}

/// <summary>
/// 启动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, System.EventArgs e)
{
StartServer();
}

/// <summary>
/// 暂停服务器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsbStop_Click(object sender, EventArgs e)
{
StopServer();
}

/// <summary>
/// 关闭
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmMainServer_FormClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
Instance.StopServer();
}

/// <summary>
/// 菜单命令
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
switch (e.ClickedItem.Text)
{
case "打开":
this.Show();
break;
case "隐藏":
this.Hide();
break;
case "关闭":
Instance.StopServer();
this.Close();
break;
}
}

/// <summary>
/// 工具栏事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
switch (e.ClickedItem.Name)
{
case "tsbAutoRun":
SetAutoRun(Core.App.fullPath, true);
break;
case "tsbAutoRunCancel":
SetAutoRun(Core.App.fullPath, false);
break;
}
}

private void notifyIcon1_DoubleClick(object sender, EventArgs e)
{
this.Show();
}

/// <summary>
/// 设置应用程序开机自动运行
/// </summary>
/// <param name="fileName">应用程序的文件名</param>
/// <param name="isAutoRun">是否自动运行,为false时,取消自动运行</param>
/// <exception cref="System.Exception">设置不成功时抛出异常</exception>
private static void SetAutoRun(string fileName, bool isAutoRun)
{
RegistryKey reg = null;
try
{
String name = fileName.Substring(fileName.LastIndexOf(@"\") + 1);
reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
if (reg == null)
reg = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
if (isAutoRun)
reg.SetValue(name, fileName);
else
reg.SetValue(name, false);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (reg != null)
reg.Close();
}
}

public static void Test()
{
frmMainServer f = new frmMainServer();
f.Show();
}
}
}

.NET Remoting 入门实例

时间: 2024-07-29 00:01:39

.NET Remoting 入门实例的相关文章

DWR之入门实例(一)

DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它的最新版本DWR0.6添加许多特性如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用spring bean),更好浏览器支持,还支持一个可选的commons-

DWR入门实例(二)

DWR(Direct Web Remoting) DWR is a Java library that enables Java on the server and JavaScript in a browser to interact and call each other as simply as possible. Dwr能让在服务器端的java代码和浏览器客户端的javascript代码尽可能简单的相互调用. DWR is Easy Ajax for Java!  官网:http://d

React 入门实例教程

React 入门实例教程 作者: 阮一峰 日期: 2015年3月31日 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西很好用,就在2013年5月开源了. 由于 React 的

Java AIO 入门实例(转)

Java7 AIO入门实例,首先是服务端实现: 服务端代码 SimpleServer: Java代码   public class SimpleServer { public SimpleServer(int port) throws IOException { final AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(por

FPGA入门实例一:LFSR

一:任务: 要求使用Verilog语言在Xilinx Virtex-6开发板上实现线性反馈移位寄存器(LFSR)的硬件逻辑设计. 二:前期准备: 基本上完成一个简单的设计需要用到以下几个软件 逻辑:Uedit32(硬件狗吐血推荐) 综合:ISE14.1 仿真:Modelsim SE 10.1b 分析:Chipscope Pro 三:设计流程 逻辑: 首先当然是RTL级设计,俗称硬件逻辑设计.使用的是Uedit32,这个软件相当于一个记事本,但编辑功能十分强大,简直是写Verilog代码的神器,具

php页面get方法实现ajax,入门实例教程

ajax,入门实例教程 本例针对php页面,做了一个小的demo加深对ajax的理解 1.文档结构: 共有ajax.php 和action.php 2个页面. 2.源码如下: /*ajax.php页面*/<!DOCTYPE html> <html lang="en"> <head> <title> ajax</title> <script type="text/javascript"> func

Omnet++ 4.0 入门实例教程

http://blog.sina.com.cn/s/blog_8a2bb17d01018npf.html 在网上找到的一个讲解omnet++的实例, 是4.0下面实现的. 我在4.2上试了试,可以用.照着做就能完成,有些小地方不同而已 Omnet++ 4.0 入门实例教程根据http://omnest.com/webdemo/ide 上的实例,自己动手做了做.新版本的4.0 跟它视频上的版本有些差别,配图说明一下我的操作过程,供大家一起学习.现在开始.首先,开发环境选择simulation 的视

freemarker入门实例与源码研究准备工作

首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的是:freemarker的ftl文件解析使用javacc实现的,所以源码中没有解析类(FMParse.java).要想研究freemarker源码,往往还需要引入freemarker.jar(含有FMParse.class),否则源码会出现编译问题.另外,还需要引入的jar包有:commons-lo

Android HttpGet() 请求简单入门实例

HttpClient httpclient = new DefaultHttpClient(); String url = "http://example.com"; List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add( new BasicNameValuePair( "param", "value" ) ); URI uri =