HttpChannel 与 TcpChannel
HttpChannel 与 TcpChannel
程序集: System.Runtime.Remoting.dll
HttpChannel 类
命名空间:
System.
HttpChannel 类使用 SOAP 协议将消息传输到远程对象或者从远程对象传输消息。所有消息都通过 SoapFormatter 对象来传递,消息在这里被更改为 XML 并被序列化,所需的 SOAP 标头将添加到流中。也可以指定二进制格式化程序,这会产生二进制数据流。然后,数据流会使用 HTTP 协议传输到目标统一资源标识符 (URI)。HttpChannel 符合 SOAP 1.1 并执行以下功能:
将 HTTP 协议用作传输协议,提供发送方和接收方之间的通信。
以 SOAP(一种 XML 编码标准)提供有效负载的编码。
将接收方设置为以 ASP.NET 并在 TCP 套接字上接收 HTTP 请求和发送 HTTP 响应。
为对象引用生成和使用 ChannelDataStore。
注意 若要在客户端上与 Microsoft Internet Explorer 一起使用 HttpChannel,则不能在 Internet Explorer 中设置代理设置的自动配置。相反,您必须在 Internet Explorer 中显式设置代理设置。
HttpChannel 一次仅打开到给定服务器的指定数目的连接。默认值是 2。可以用应用程序配置文件中的 clientConnectionLimit 属性来更改默认值。
TcpChannel 类
命名空间:
System.
TcpChannel 类用二进制格式化程序将所有消息序列化为二进制流并且用 TCP 协议将流传输到目标统一资源标识符 (URI)。TcpChannel 执行以下功能:
使用 TCP 套接字提供发送方和接收方之间的通信。
以二进制格式和工业标准 SOAP 序列化格式提供有效负载的编码。
为对象引用生成和使用 ChannelDataStore。
TcpChannel 打开并缓存与当时正在向另一个服务器发出请求的线程一样多的连接。客户端上的套接字连接将在处于不活动状态 15-20 秒钟之后关闭。
如果您正在生成大量使用 .NET 远程处理的应用程序,则可能容易错误地使用 HttpChannel 对象来连接到通过 TcpChannel 侦听的服务器应用程序域。如果您执行了该操作,客户端将收到以下异常:“基础连接已经关闭:接收时发生意外错误”。如果您的客户端收到该异常,则应检查客户端和服务器是否有不匹配的信道。
测试demo:
公共类:
[Serializable] public class User { public User(string name, bool male) { this.name = name; this.male = male; } string name = ""; bool male = true; public string Name { get { return name; } set { name = value; } } public bool Male { get { return male; } set { male = value; } } }
public class HelloServer : MarshalByRefObject { public HelloServer() { Console.WriteLine("Helow Service 启动"); } public string HelloUserMethod(User user) { string title; if (user.Male) { title = "先生"; } else { title = "女生"; } Console.WriteLine(string.Format("Hellow {0}{1}",user.Name,title)); return "你好:" + user.Name + title; } public int Sum(int i,int j) { return i + j; } public void Byte(byte[] data) { Console.WriteLine("传入字符串:"+Encoding.UTF8.GetString(data)); } }
服务端:
class Program { static int Main(string[] args) { TcpChannel chan1 = new TcpChannel(8085); HttpChannel chan2 = new HttpChannel(8001); //启动端口 ChannelServices.RegisterChannel(chan1,false); ChannelServices.RegisterChannel(chan2,false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(HelloServer), "SayHello", WellKnownObjectMode.Singleton); //创建类的实例 System.Console.WriteLine("Press Enter key to exit"); System.Console.ReadLine(); return 0; } }
客户端:
class Program { public static void Main(string[] args) { //使用HTTP通道得到远程对象 HttpChannel chan2 = new HttpChannel(); ChannelServices.RegisterChannel(chan2, false); // HelloServer obj1 = (HelloServer)Activator.GetObject(typeof(HelloServer), "http://localhost:8001/SayHello");//创建类的实例 HelloServer obj1 = (HelloServer)Activator.GetObject(typeof(HelloServer), "http://localhost:8001/SayHello");//创建类的实例 if (obj1 == null) { System.Console.WriteLine( "Could not locate HTTP server"); } else { for (int i = 0; i < 10; i++) { var user = new User("张生"+i, true); Console.WriteLine("Client1 TCP HelloUserMethod {0}", obj1.HelloUserMethod(user)); //将类作为参数(将User作为参数必须是serializable) Console.WriteLine("SUM="+obj1.Sum(1,2)); var str = @"测试字符串"; Console.WriteLine("传入字符串:"+ str); obj1.Byte(Encoding.UTF8.GetBytes(str)); Console.WriteLine("------------------------------------------"); System.Threading.Thread.Sleep(1000); } } Console.Read(); } }