.Net Remoting中Remote Server的Port占用/释放问题

这一问题一般出现在Console application/Windows Service承载Remote Objects时,要求Remote Server指定特定portIIS在承载Remote Objects并不需要指定特定port,因此一般不会出现SocketException异常信息。

 

1. 启动承载Remote ObjectsConsole application,发现指定的port状态为:LISTENING

显然Remote Server开始监听该port,可以接受Client端的请求。

 

2. 在关闭承载Remote ObjectsConsole application后,发现指定的port状态为:TIME_WAIT

 

如果现在启动该Console application,就会抛出如下异常:

An unhandled exception of type 'System.Runtime.Remoting.RemotingException' occurred in mscorlib.dll

 

Additional information: Remoting configuration failed with the exception System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port)

is normally permitted

 

SocketException异常:每一个socket address (protocol/network address/port)只能有一个使用。

 

3. 个人观点

关于TIME_WAIT状态,这是windows系统设计的,防止来自旧的连接(old connection)的剩余packets干扰新的连接(new connection)。因此,默认会等待4分钟,让那些剩余的packets丢弃掉。

 

因此,不要试图去解决这一问题。等待4分钟左右的时间,确认该port确定已释放,再启动Remote Server,如Console application/Windows Service等。

 

不同观点或意见,请发表评论或指出。谢谢。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Standard 使用 Remoting 需要使用 System.Runtime.Remoting 命名空间下的类。以下是使用 Remoting 的基本步骤: 1. 创建一个 Remoting 服务端应用程序,并在其定义一个远程对象。使用 System.Runtime.Remoting.RemotingConfiguration.Configure() 方法来启用 Remoting 支持。 2. 在客户端应用程序,使用 System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownClientType() 方法来注册远程对象的类型,并使用 Activator.GetObject() 方法来获取远程对象的实例。 3. 通过远程对象的代理,客户端可以调用远程对象的方法。 以下是一个简单的示例代码: 服务端应用程序: ```csharp using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; namespace RemotingServer { class Program { static void Main(string[] args) { TcpServerChannel channel = new TcpServerChannel(8080); ChannelServices.RegisterChannel(channel, false); RemotingConfiguration.RegisterWellKnownServiceType( typeof(MyService), "MyService", WellKnownObjectMode.Singleton); Console.WriteLine("Remoting server is running..."); Console.ReadLine(); } } public class MyService : MarshalByRefObject { public string SayHello(string name) { return $"Hello, {name}!"; } } } ``` 客户端应用程序: ```csharp using System; using System.Runtime.Remoting; namespace RemotingClient { class Program { static void Main(string[] args) { RemotingConfiguration.RegisterWellKnownClientType( typeof(MyService), "tcp://localhost:8080/MyService"); MyService service = (MyService)Activator.GetObject( typeof(MyService), "tcp://localhost:8080/MyService"); string result = service.SayHello("World"); Console.WriteLine(result); Console.ReadLine(); } } public class MyService : MarshalByRefObject { public string SayHello(string name) { return $"Hello, {name}!"; } } } ``` 在上面的示例,服务端应用程序创建了一个名为 MyService 的远程对象,并将其注册为单例模式。客户端应用程序使用 RemotingConfiguration.RegisterWellKnownClientType() 方法注册远程对象类型,并使用 Activator.GetObject() 方法获取远程对象的实例。然后,客户端应用程序通过远程对象的代理调用 MyService.SayHello() 方法,该方法返回一个字符串,表示问候语。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值