[Mono-list] Bi-directional remoting

Urs Muff umuff@quark.com
Fri, 21 Feb 2003 13:26:58 -0700


> This creates an entirely new TCP connection right? It doesn't use the
> existing TCP session already in place correct?
[Urs] Yes, and Lluis suggestion worked.

> 
> -----Original Message-----
> From: Lluis Sanchez [mailto:lluis@ideary.com]
> Sent: Friday, February 21, 2003 12:51 PM
> To: Urs Muff; mono-list@lists.ximian.com
> Subject: Re: [Mono-list] Bi-directional remoting
> 
> 
> Bi-directional remotingHi,
> 
> In the client configuration file change <channel ref="tcp"> to <channel
> ref="tcp" port="0">. This will create a tcp listener in the client
> (however,
> in mono configuration files don't work yet).
> 
> Lluis.
> 
> ----- Original Message -----
> From: Urs Muff
> To: 'mono-list@lists.ximian.com'
> Sent: Friday, February 21, 2003 7:26 PM
> Subject: [Mono-list] Bi-directional remoting
> 
> 
> How would you create such a bi-directional channel?  All the samples I
> used
> so far are only server-client, but not the other way around. I have a
> delegate that I want to implement on the client side.  The class
> implementing the callback sits on the client (of course). I even use the
> common abstract pattern described by a Microsoft KB article, but still no
> luck. Debug output: ASP.Net Server starting Server.Do start An unhandled
> exception of type 'System.Runtime.Remoting.RemotingException'
> occurred in mscorlib.dll
> Additional information: This remoting proxy has no channel sink which
> means
> either the server has no registered server channels that are listening, or
> this application has no suitable client channel to talk to the server.
> 
> 
> Here is the sample code:
> 
> 
> CommonLib: [both server and client have access]
> -----------------------------------------------
> using System;
> using System.Runtime.Remoting;
> public delegate void BaseEventHandler(object sender,RemoteEventArgs e);
> [Serializable] public class RemoteEventArgs : EventArgs {
>         public static new RemoteEventArgs Empty = new RemoteEventArgs(); }
> public abstract class RemoteCallback : MarshalByRefObject {
>         [System.Runtime.Remoting.Messaging.OneWay]
>         public void Callback(object sender,RemoteEventArgs e)
>         {
>                 CallbackImpl(sender,e);
>         }
>         protected abstract void CallbackImpl(object sender,RemoteEventArgs
> e); } public interface IServer {
>         event BaseEventHandler Evt;
>         void Do();
> }
> 
> 
> ASP.Net Server:
> --------------------------------------------
> class S : MarshalByRefObject, IServer
> {
>         public event BaseEventHandler Evt;
>         public void Do()
>         {
>                 System.Diagnostics.Debug.WriteLine("Server.Do start");
>                 if (Evt != null) Evt(this,RemoteEventArgs.Empty);
>                 System.Diagnostics.Debug.WriteLine("Server.Do end");
>         }
> }
> public class Service1 : System.Web.Services.WebService
> {
>         ... // standard web service stuff (autogenerated)
>         static bool Init = false;
>         [WebMethod]
>         public void StartUp()
>         {
>                 if (!Init)
>                 {
>                         RemotingConfiguration.Configure("/Server.config");
>                         Init = true;
>                 }
>                 System.Diagnostics.Debug.WriteLine("ASP.Net Server
> starting");
>         }
> }
> <configuration>
>   <system.runtime.remoting>
>     <application>
>       <service>
>         <wellknown
>            mode="Singleton"
>            type="S, Server"
>            objectUri="S"
>         />
>       </service>
>       <channels>
>         <channel ref="tcp" port="8085">
>           <serverProviders>
>                 <formatter ref="binary"/>
>           </serverProviders>
>         </channel>
>       </channels>
>     </application>
>   </system.runtime.remoting>
> </configuration>
> Client:
> --------------------------------------------
> using System;
> using System.Runtime.Remoting;
> public class Test
> {
>         static void Main()
>         {
>                 RemotingConfiguration.Configure("../../Client.config");
> 
>                 new Client.localhost.Service1().StartUp();
>                 IServer s =
> Activator.GetObject(typeof(IServer),"tcp://localhost:8085/S") as IServer;
>                 s.Evt += new BaseEventHandler(
>                         new ClientChangedCallback().Callback);
>                 s.Do();
>                 System.Diagnostics.Debug.WriteLine("I never get here");
>         }
> }
> public class ClientChangedCallback : RemoteCallback
> {
>         protected override void CallbackImpl(object sender,RemoteEventArgs
> e)
>         {
>                 System.Diagnostics.Debug.WriteLine("And of course I never
> get here");
>         }
> }
> <configuration>
>   <system.runtime.remoting>
>      <application>
>         <channels>
>            <channel ref="tcp">
>               <clientProviders>
>                  <formatter ref="binary"/>
>               </clientProviders>
>            </channel>
>         </channels>
>      </application>
>   </system.runtime.remoting>
> </configuration>
> 
> _______________________________________________
> Mono-list maillist  -  Mono-list@lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list