闲来无事想玩玩双向通信,实现类似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;
}
}










