1

在我的 .NET 远程处理应用程序中,如何在没有应用程序退出的情况下真正在代码中处理/释放 TCP 通道(端口)?

完整的代码可以在GitHub上找到。

服务器

private static void Main(string[] args)
{
    Console.WriteLine("Server side ....");

    while (true)
    {
        Console.WriteLine();
        Console.WriteLine("Press S for stopping service, others for start ...");
        var key = Console.ReadKey();
        if (key.Key == ConsoleKey.S)
        {
            var channel = ChannelServices.GetChannel("x");
            ChannelServices.UnregisterChannel(channel);

            Console.WriteLine("TCP Channel stopped!!!");
        }
        else
        {
            var provider = new BinaryServerFormatterSinkProvider
            {
                TypeFilterLevel = TypeFilterLevel.Full
            };
            var props = new Hashtable
            {
                {"port", 25253},
                {"name", "x"}
            };
            var channel = new TcpServerChannel(props, provider);
            ChannelServices.RegisterChannel(channel, false);
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(People), "p",
                WellKnownObjectMode.Singleton);

            Console.WriteLine("TCP Channel started!!!");
        }
    }
}

客户

private static void Main(string[] args)
{
    Console.WriteLine("Client side ....");

    var i = 0;
    while (true)
    {
        try
        {
            var p = (People) Activator.GetObject(typeof(People), "tcp://localhost:25253/p");
            p.SetAge(i);
            Console.WriteLine($"{i} succeed => {p.Age}");
            Thread.Sleep(2000);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"{i} failed ==> {ex.Message}");
        }

        i++;
    }
}

除此之外,我使用以下 PS 命令来检查端口使用情况:

 Get-Process -Id (Get-NetTCPConnection -LocalPort 25253).OwningProcess

虽然该通道在服务器中未注册,但该端口仍由服务器进程使用。

注意:我知道另一个问题,即使频道未注册,客户端仍然可以连接并成功运行。那里有一些缓存,但无论如何这不是问题。我想要的是可以在不终止应用程序的情况下释放端口。

4

0 回答 0