Ukázka sdílení portů Net.TCP

Tento článek popisuje ukázku sdílení portů.

Protokol TCP/IP používá 16bitové číslo, označované jako port, k rozlišení připojení k více síťovým aplikacím běžícím na stejném počítači. Pokud aplikace naslouchá na portu, veškerý provoz TCP pro tento port přejde do této aplikace. Ostatní aplikace nemůžou na daném portu současně naslouchat.

Mnoho protokolů má standardní nebo výchozí číslo portu, které používají. Například protokol HTTP obvykle používá port TCP 80. Internetové informační služby (IIS) mají posluchač pro sdílení portu mezi více aplikacemi HTTP. Služba IIS naslouchá na portu přímo a předává zprávy příslušné aplikaci na základě informací uvnitř datového proudu zpráv. To umožňuje více aplikacím HTTP používat stejné číslo portu, aniž by museli soutěžit o rezervaci portu pro příjem zpráv.

Sdílení portů NetTcp je funkce WCF (Windows Communication Foundation), která podobně umožňuje více síťovým aplikacím sdílet jeden port. Služba sdílení portů NetTcp přijímá připojení pomocí protokolu net.tcp a předává zprávy na základě jejich cílové adresy.

Služba sdílení portů NetTcp není ve výchozím nastavení povolená. Před spuštěním této ukázky je nutné službu povolit ručně. Další informace naleznete v tématu Postupy: Povolení služby sdílení portů Net.TCP. Pokud je služba zakázaná, při spuštění serverové aplikace se vyvolá výjimka.

Unhandled Exception: System.ServiceModel.CommunicationException: The TransportManager failed to listen on the supplied URI using the NetTcpPortSharing service: failed to start the service because it is disabled. An administrator can enable it by running 'sc.exe config NetTcpPortSharing start= demand'.. ---> System.InvalidOperationException: Cannot start service NetTcpPortSharing on computer '.'. ---> System.ComponentModel.Win32Exception: The service cannot be started, either because it is disabled or because it has no enabled devices associated with it

Sdílení portů je na serveru povoleno nastavením PortSharingEnabled vlastnosti NetTcpBinding vazby nebo elementu vazby TcpTransportBindingElement . Klient nemusí vědět, jak je sdílení portů nakonfigurované tak, aby ho používalo na serveru.

Povolení sdílení portů

Následující kód ukazuje povolení sdílení portů na serveru. Spustí instanci ICalculator služby na pevném portu s náhodnou cestou URI. I když dvě služby můžou sdílet stejný port, jejich celkové adresy koncových bodů musí být stále jedinečné, aby služba sdílení portů NetTcp mohl směrovat zprávy do správné aplikace.

// Configure a binding with TCP port sharing enabled
NetTcpBinding binding = new NetTcpBinding();
binding.PortSharingEnabled = true;

// Start a service on a fixed TCP port
ServiceHost host = new ServiceHost(typeof(CalculatorService));
ushort salt = (ushort)new Random().Next();
string address = $"net.tcp://localhost:9000/calculator/{salt}";
host.AddServiceEndpoint(typeof(ICalculator), binding, address);
host.Open();

Při povoleném sdílení portů můžete službu spustit několikrát, aniž byste museli mít konflikt s číslem portu. Pokud změníte kód tak, aby zakázal sdílení portů, při spuštění dvou kopií služby dojde k tomu, že druhá selže s chybou AddressAlreadyInUseException.

Unhandled Exception: System.ServiceModel.AddressAlreadyInUseException: There is already a listener on IP endpoint 0.0.0.0:9000. Make sure that you are not trying to use this endpoint multiple times in your application and that there are no other applications listening on this endpoint. ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted

Spustit ukázkový kód

Pomocí testovacího klienta můžete zkontrolovat, jestli jsou zprávy správně směrované na služby sdílející port.

class client
{
   static void Main(string[] args)
   {
      Console.Write("Enter the service number to test: ");
      ushort salt = ushort.Parse(Console.ReadLine());
      string address = $"net.tcp://localhost:9000/calculator/{salt}";
      ChannelFactory<ICalculator> factory = new ChannelFactory<ICalculator>(new NetTcpBinding());
      ICalculator proxy = factory.CreateChannel(new EndpointAddress(address));

      // Call the Add service operation.
      double value1 = 100.00D;
      double value2 = 15.99D;
      double result = proxy.Add(value1, value2);
      Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

      // Call the Subtract service operation.
      value1 = 145.00D;
      value2 = 76.54D;
      result = proxy.Subtract(value1, value2);
      Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

      // Call the Multiply service operation.
      value1 = 9.00D;
      value2 = 81.25D;
      result = proxy.Multiply(value1, value2);
      Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

      // Call the Divide service operation.
      value1 = 22.00D;
      value2 = 7.00D;
      result = proxy.Divide(value1, value2);
      Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);

      Console.WriteLine();
      Console.WriteLine("Press <ENTER> to terminate client.");
      Console.ReadLine();

      factory.Close();
   }
}

Každá instance služby vytiskne své jedinečné číslo a adresu. Například při spuštění service.exese může zobrazit následující text.

Service #4381 listening on net.tcp://localhost:9000/calculator/4381.
Press <ENTER> to terminate service.

Zadejte číslo služby, které se zde zobrazí při spuštění client.exe.

Enter the service number to test: 4381
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

Tuto ukázku je možné spustit v konfiguraci mezi počítači změnou vygenerované adresy, kterou klient používá. V Client.cs změňte řetězec formátu adresy koncového bodu tak, aby odpovídal nové adrese vaší služby. Nahraďte všechny odkazy na localhost IP adresou počítače serveru. Po provedení této změny je nutné ukázku znovu zkompilovat.

Jak nastavit, sestavit a spustit ukázku

  1. Pomocí následujícího příkazu nainstalujte ASP.NET 4.0.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  3. Povolte službu sdílení portů NetTcp, jak je popsáno v úvodní části.

  4. Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.

  5. Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation. Konkrétní podrobnosti pro spuštění této ukázky jsou zahrnuty dříve v části Spuštění ukázky.