在我的 .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
虽然该通道在服务器中未注册,但该端口仍由服务器进程使用。
注意:我知道另一个问题,即使频道未注册,客户端仍然可以连接并成功运行。那里有一些缓存,但无论如何这不是问题。我想要的是可以在不终止应用程序的情况下释放端口。