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单通道双向通信.
第一个收费
第二个免费
不过帮助文档全英文.
[解决办法]
如果说在本地实验没问题 上传服务器后 应该也不会有问题啊~~
可能是防火墙没关闭的问题吧?
[解决办法]