• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C#NetRemoting实现双向通信的示例代码

c# 搞代码 4年前 (2022-01-09) 17次浏览 已收录 0个评论

本篇文章主要介绍了C# NetRemoting实现双向通信,.Net Remoting 是由客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象来实现通信的

闲来无事想玩玩双向通信,实现类似QQ的互发消息的功能。于是乎开始学习.Net Remoting.

.Net Remoting 是由客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象来实现通信的。也就是说对象是由服务端创建的。

先上代码

首先是ICommand库

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ICommand{  public interface IRemotingObject  {    event SendHandler ClientToServer;    event ReceiveHandler ServerToClient;    event UserChangedHandler Login;    event UserChangedHandler Exit;    /// <summary>    /// 加法运算    /// </summary>    /// <param name="x1">参数1</param>    /// <param name="x2">参数2</param>    /// <returns></returns>    string SUM(int x1, int x2);    /// <summary>    /// 获取服务端事件列表    /// </summary>    Delegate[] GetServerEventList();    /// <summary>    /// 发送消息    /// </summary>    /// <param name="info"></param>    /// <param name="toName"></param>    void ToServer(object info, string toName);    /// <summary>    /// 接受信息    /// </summary>    /// <param name="info"></param>    /// <param name="toName"></param>    void ToClient(object info, string toName);    void ToLogin(string name);    void ToExit(string name);  }  /// <summary>  /// 客户端发送消息  /// </summary>  /// <param name="info">信息</param>  /// <param name="toName">发送给谁,""表示所有人,null表示没有接收服务器自己接收,其他表示指定某人</param>  public delegate void SendHandler(object info, string toName);  /// <summary>  /// 客户端接收消息  /// </summary>  /// <param name="info">信息</param>  /// <param name="toName">发送给谁,""表示所有人,null表示没有接收服务器自己接收,其他表示指定某人</param>  public delegate void ReceiveHandler(object info, string toName);  /// <summary>  /// 用户信息事件  /// </summary>  /// <param name="name">用户名</param>  public delegate void UserChangedHandler(string name);}
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ICommand{  public class SwapObject : MarshalByRefObject  {    public event ReceiveHandler SwapServerToClient     {      add { _receive += value; }      remove { _receive -= value; }    }    /// <summary>    /// 接受信息    /// </summary>    /// <param name="info"></param>    /// <param name="toName"></param>    public void ToClient(object info, string toName)    {      if (_receive != null)        _receive(info, toName);    }    //无限生命周期     public override object InitializeLifetimeService()    {      return null;    }    private ReceiveHandler _receive;  } }

第一个类就是定义一些接口,和一些委托,没有实质性的东西。

第二个类是定义了上一个接口类中的ToClient的事件和方法,作用之后会讲到。

然后就是集成ICommand接口的实质性的数据类

using System;using System.Collections.Generic;using System.Linq;using System.Text;using ICommand;namespace NetRemoting{  public class RemotingObject : MarshalByRefObject, IRemotingObject  {    /// <summary>    /// 发送事件    /// </summary>    public event SendHandler ClientToServer    {      add { _send += value; }      remove { _send -= value; }    }    /// <summary>    /// 接收消息事件    /// </summary>    public event ReceiveHandler ServerToClient;    /// <summary>    /// 发送事件    /// </summary>    public event UserChangedHandler Login    {      add { _login += value; }      remove { _login -= value; }    }    /// <summary>    /// 发送事件    /// </summary>    public event UserChangedHandler Exit    {      add { _exit += value; }      remove { _exit -= value; }    }    /// <summary>    /// 加法运算    /// </summary>    /// <param name="x1">参数1</param>    /// <param name="x2">参数2</param>    /// <returns></returns>    public string SUM(int x1, int x2)    {      return x1 + "+" + x2 + "=" + (x1 + x2);    }    /// <summary>    /// 绑定服务端向客户端发送消息的事件方法    /// </summary>    /// <param name="receive">接收事件</param>    public Delegate[] GetServerEventList()    {      return this.ServerToClient.GetInvocationList();    }    /// <summary>    /// 发送消息    /// </summary>    /// <param name="info"></param>    /// <param name="toName"></param>    public void ToServer(object info, string toName)    {      if (_send != null)        _send(info, toName);    }    /// <summary>    /// 接收消息    /// </summary>    /// <param name="info"></param>    /// <param name="toName"></param>    public void ToClient(object info, string toName)    {      if (_receive != null)        _receive(info, toName);    }    /// <summary>    /// 登录    /// </summary>    /// <param name="name">用户名</param>    public void ToLogin(string name)    {      if (!_nameHash.Contains(name))      {        _nameHash.Add(name);        if (_login != null)          _login(name);      }      else      { throw new Exception("用户已存在"); }    }    /// <summary>    /// 退出    /// </summary>    /// <param name="name">用户名</param>    public void ToExit(string name)    {      if (_nameHash.Contains(name))      {        _nameHash.Remove(name);        if (_exit != null)          _exit(name);  <strong style="color:transparent">本文来源gao@daima#com搞(%代@#码@网&</strong>    }    }    private SendHandler _send;    private ReceiveHandler _receive;    private UserChangedHandler _login;    private UserChangedHandler _exit;    private HashSet<string> _nameHash = new HashSet<string>();  }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C#NetRemoting实现双向通信的示例代码

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址