上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.2 端口共享(Port Sharing)
在基于TCP/IP的对等网络通信下,相互通信的应用程序运行于各自的应用进程中,处于应用层的进程将数据封装成数据报,并通过传输层的TCP或UDP进行网络通信。而TCP和UPD则通过一个16bit的端口来识别不同的应用程序。对于一些常用网络服务,它们都有一个知名的端口号与之匹配。比如,FTP服务用的TCP端口为21;Telnet服务的TCP端口为23等。而客户端通常对所使用的端口并不关心,只须要保证端口在本机是唯一的就可以了,这样的端口又成为临时端口,临时端口一般在1024到5000之间。
一般来讲,在某一个时刻,一个端口只能供一个应用程序使用。对于WCF来说,当我们通过一个托管的应用程序对某个服务进行寄宿的时候,一个端口被该应用程序独占使用。下面的例子通过两个不同的控制台应用程序对两个服务Service1和Service2进行寄宿,两个服务的终结点地址共享相同的端口:9999。先后运行这两个服务寄宿应用程序,第一个能够正常运行,第二个则会抛出如图2-4所示的AdressAlreadyInUseException异常,提示端口9999已经用于网络侦听。
图2-4 端口的重用导致AdressAlreadyInUseException异常
using(ServiceHost serviceHost = new ServiceHost(typeof(Service1))) { serviceHost.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(), "net.tcp://127.0.0.1:9999/service1"); serviceHost.Open(); Console.Read(); }
using(ServiceHost serviceHost = new ServiceHost(typeof(Service2))) { serviceHost.AddServiceEndpoint(typeof(IService2), new NetTcpBinding(), "net.tcp://127.0.0.1:9999/service2"); serviceHost.Open(); Console.Read(); }
本节将介绍如何解决这种端口被某一个应用程序独占使用的问题,让不同的监听程序能够共享同一个端口。在这之前,我们需要了解端口的共享具有什么现实的意义。