首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

Remoting的事件处理在互联网上不可用吗?该怎么解决

2012-03-01 
Remoting的事件处理在互联网上不可用吗?最近做一个项目,需要用到Remoting的远程事件处理。我写了一个例子,

Remoting的事件处理在互联网上不可用吗?
最近做一个项目,需要用到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"));
  }
  }
}

[解决办法]
关注!!!
一直学习Remoting,还没做过例子呢!!
up!!
[解决办法]
Remoting比较适合局域网环境,但因特网肯定也可以
[解决办法]
up
[解决办法]
如果服务器可以主动连接客户端就可用,反之不能。

因为Remoting的Socket连接是短连接。
[解决办法]
会是防火墙的问题吗
[解决办法]
Remoting主要是面向同构网络环境,即网络主机平台类似场合,其采用的是二进制数据串行化标准,所以多应用于intranet,数据传输效率高。但是一般在异构广域网场合还是多采用SOAP+Web Service,因为主机环境多是异构的,Web Service串行化标准采用SOAP方式是可以跨平台解释的,而且Web Service本身就考虑了穿越防火墙的问题。
[解决办法]
可以连接。好像听过也是个协议。
[解决办法]
.NET Remoting有两种信道:使用HTTP和TCP信道之间的区别在于:如果应用程序是在局域网上运行,则最好使用TCP信道,因为它的性能要好于HTTP信道;如果应用程序是在互联网上运行,则有时候根据防火墙的配置,HTTP是唯一的选择。需要记住的是,如果使用了防火墙软件,则防火墙应该配置成允许TCP数据流量通过你为对象选择的端口。

[解决办法]
好像是不能穿越防火墙。所以remoting一般别用双向事件。不知道WCF怎么样。。。
[解决办法]
一般来说除非是客户端与服务器的开发都由自己做或控制,可以自己编写remoting的通讯协议,这样的通讯在互联网上放着是没有问题的,但是如果是你自己只能写客户端的程序然后采用remoting的方式去进行通讯可能有点不太好,可以考虑用webservice
[解决办法]
up
学习
[解决办法]
props["port"] = 8081; 
TcpChannel channel = new TcpChannel(props, clientProvider, serverProvider
信道改成httpchannel 端口改成8080 然后两边防火墙先全部关闭调试ok就说明程序没有问题
[解决办法]
貌似Remoting的事件处理默认使用TCP的,所以在局域网比较好
而且事件是需要回调的,客户端有防火墙的话就不好办了。。。

不过自定义协议的话就另当别论。。。不过这部分很深奥。。。期待高人出现。。。
[解决办法]
帮你顶
[解决办法]
如果服务器可以主动连接客户端就可用,反之不能。 

因为Remoting的Socket连接是短连接。
[解决办法]
对于Remoting,我一直很失望,失望到了要自己动手制作自己的远程调用框架……痛并快乐着
[解决办法]
你可以试一试
GenuineChannels和 BidirectionalTCPChannel

他们都实现了TCP单通道双向通信.
第一个收费
第二个免费

不过帮助文档全英文.
[解决办法]
如果说在本地实验没问题 上传服务器后 应该也不会有问题啊~~

可能是防火墙没关闭的问题吧?
[解决办法]

探讨
如果说在本地实验没问题 上传服务器后 应该也不会有问题啊~~

可能是防火墙没关闭的问题吧?

热点排行