最近做一个项目,需要用到Remoting的远程事件处理。我写了一个例子,在本机运行没问题,可是当我把服务器端拷到服务器上再运行的时候,就不行了。包括我下载的 张逸 老师的 Remoting事件(服务端广播) 示例放到服务器上也不可用。Remoting的事件处理在互联网不可应用吗?服务器端代码(Server):
using System;
using System.Collections.Generic;
using System.Text;
using ClassLib;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;namespace Server
{
class Program
{
static void Main(string[] args)
{
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; System.Collections.Hashtable props = new System.Collections.Hashtable();
props["port"] = 8081;
TcpChannel channel = new TcpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(channel, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(SayHello), "SayHello", WellKnownObjectMode.Singleton);
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; Console.ReadKey();
}
}
}客户端代码(Client):
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using ClassLib;namespace Client
{
class Program
{
static void Main(string[] args)
{
TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel, false); RemotingConfiguration.RegisterWellKnownClientType(typeof(SayHello), "tcp://219.235.3.120:8081/SayHello"); BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; System.Collections.Hashtable props = new System.Collections.Hashtable();
props["port"] = 8082;
props["name"] = "tcp2";
TcpChannel channel1 = new TcpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(channel1, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(Common.EventCenter), "EventCenter", WellKnownObjectMode.Singleton);
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; SayHello Hello = new SayHello();
Common.EventCenter center = new Common.EventCenter();
center.AfterSaid += new Common.AfterSaidEventHandler(Hello_AfterSaid);
Hello.AfterSaid += new Common.AfterSaidEventHandler(center.Method);
Hello.Say();
Console.ReadKey();
} static void Hello_AfterSaid(object sender, Common.AfterSaidEventArgs e)
{
Console.WriteLine("事件触发");
}
}
}
公共类库代码(Common):
using System;
using System.Collections.Generic;
using System.Text;namespace Common
{
[Serializable]
public class EventCenter : MarshalByRefObject
{
public event Common.AfterSaidEventHandler AfterSaid; public void Method(object sender, AfterSaidEventArgs e)
{
if (AfterSaid != null)
AfterSaid(this, new Common.AfterSaidEventArgs("Hello"));
}
} /// <summary>
/// SayHello后的事件委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
[Serializable]
public delegate void AfterSaidEventHandler(object sender, AfterSaidEventArgs e); /// <summary>
/// SayHello后触发事件的参数类
/// </summary>
[Serializable]
public class AfterSaidEventArgs : EventArgs
{
/// <summary>
/// 刚刚说过的话
/// </summary>
public string StrSaid; public AfterSaidEventArgs(string str)
{
StrSaid = str;
}
}
}事件类代码(ClassLib):
using System;
using System.Collections.Generic;
using System.Text;namespace ClassLib
{
/// <summary>
/// 一个会说Hello的类
/// </summary>
public class SayHello : MarshalByRefObject
{
private static event Common.AfterSaidEventHandler _AfterSaid; public SayHello()
{ } /// <summary>
/// 说完Hello后触发的事件
/// </summary>
public event Common.AfterSaidEventHandler AfterSaid
{
add
{
_AfterSaid += value;
}
remove
{
_AfterSaid -= value;
}
} /// <summary>
/// 说一句 Hello
/// </summary>
public void Say()
{
Console.WriteLine("Hello");
if (_AfterSaid != null)
_AfterSaid(this, new Common.AfterSaidEventArgs("Hello"));
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using ClassLib;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;namespace Server
{
class Program
{
static void Main(string[] args)
{
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; System.Collections.Hashtable props = new System.Collections.Hashtable();
props["port"] = 8081;
TcpChannel channel = new TcpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(channel, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(SayHello), "SayHello", WellKnownObjectMode.Singleton);
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; Console.ReadKey();
}
}
}客户端代码(Client):
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using ClassLib;namespace Client
{
class Program
{
static void Main(string[] args)
{
TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel, false); RemotingConfiguration.RegisterWellKnownClientType(typeof(SayHello), "tcp://219.235.3.120:8081/SayHello"); BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; System.Collections.Hashtable props = new System.Collections.Hashtable();
props["port"] = 8082;
props["name"] = "tcp2";
TcpChannel channel1 = new TcpChannel(props, clientProvider, serverProvider);
ChannelServices.RegisterChannel(channel1, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(Common.EventCenter), "EventCenter", WellKnownObjectMode.Singleton);
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; SayHello Hello = new SayHello();
Common.EventCenter center = new Common.EventCenter();
center.AfterSaid += new Common.AfterSaidEventHandler(Hello_AfterSaid);
Hello.AfterSaid += new Common.AfterSaidEventHandler(center.Method);
Hello.Say();
Console.ReadKey();
} static void Hello_AfterSaid(object sender, Common.AfterSaidEventArgs e)
{
Console.WriteLine("事件触发");
}
}
}
公共类库代码(Common):
using System;
using System.Collections.Generic;
using System.Text;namespace Common
{
[Serializable]
public class EventCenter : MarshalByRefObject
{
public event Common.AfterSaidEventHandler AfterSaid; public void Method(object sender, AfterSaidEventArgs e)
{
if (AfterSaid != null)
AfterSaid(this, new Common.AfterSaidEventArgs("Hello"));
}
} /// <summary>
/// SayHello后的事件委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
[Serializable]
public delegate void AfterSaidEventHandler(object sender, AfterSaidEventArgs e); /// <summary>
/// SayHello后触发事件的参数类
/// </summary>
[Serializable]
public class AfterSaidEventArgs : EventArgs
{
/// <summary>
/// 刚刚说过的话
/// </summary>
public string StrSaid; public AfterSaidEventArgs(string str)
{
StrSaid = str;
}
}
}事件类代码(ClassLib):
using System;
using System.Collections.Generic;
using System.Text;namespace ClassLib
{
/// <summary>
/// 一个会说Hello的类
/// </summary>
public class SayHello : MarshalByRefObject
{
private static event Common.AfterSaidEventHandler _AfterSaid; public SayHello()
{ } /// <summary>
/// 说完Hello后触发的事件
/// </summary>
public event Common.AfterSaidEventHandler AfterSaid
{
add
{
_AfterSaid += value;
}
remove
{
_AfterSaid -= value;
}
} /// <summary>
/// 说一句 Hello
/// </summary>
public void Say()
{
Console.WriteLine("Hello");
if (_AfterSaid != null)
_AfterSaid(this, new Common.AfterSaidEventArgs("Hello"));
}
}
}
解决方案 »
- *****比較if-else與三目運算符的效率*****
- 关于listview添加图片(windows开发)
- richtextbox字体设置
- 如何判断time1 = 15:45:32是接近于rime2 = 13:30:30,还是更接近于rime3 = 16:00:00
- XmlTextWriter的一个小问题,可是我不熟悉C#, 刚开始学
- 从girdview输出到excel中的问题
- 如何用C# 在WEB页面里实现 对exchange的收发邮件
- 请问在哪里才可以得到C#的参考手册?
- 用c#做windows service 只能重载OnStart,OnStop, 不能向应用程序提供其他函数接口了吗?(我每次都给分)
- “System.OutOfMemoryException”类型的未经处理的异常在 System.Drawing.dll 中发生
- 求教高人,为什么说值类型继承自ValueType??
- 关于Remoting的远程事件
一直学习Remoting,还没做过例子呢!!
up!!
解决的方法是编写一个可以双向通信的TcpChannel 看来还是穿不了防火墙,呵呵。
写一个双向通道看来是没有时间了,算了,暂时用P2P形式的函数代替事件吧。希望大家继续讨论,找到一个比较好的处理方法。
TcpChannel channel = new TcpChannel(props, clientProvider, serverProvider
信道改成httpchannel 端口改成8080 然后两边防火墙先全部关闭调试ok就说明程序没有问题
而且事件是需要回调的,客户端有防火墙的话就不好办了不过自定义协议的话就另当别论不过这部分很深奥期待高人出现
GenuineChannels和 BidirectionalTCPChannel他们都实现了TCP单通道双向通信.
第一个收费
第二个免费不过帮助文档全英文.