CÓMO: Calcular la referencia de un objeto a un servidor remoto por referencia mediante Visual Basic .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 301112 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E301112
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo se muestra cómo calcular la referencia de un objeto por referencia para un servidor remoto. Al calcular la referencia de un objeto por referencia, el tiempo de ejecución crea un proxy transparente, de manera que el servidor pueda volver a hacer llamadas al objeto en el cliente. Lo único que se envía al servidor es el proxy. El proxy calcula la referencia de las devoluciones de llamadas al cliente.

Este artículo se divide en tres partes: el objeto de servidor, la aplicación de servidor y la aplicación cliente. Se amplía en los artículos siguientes de Microsoft Knowledge Base:
300951 CÓMO: Crear un servidor remoto mediante Visual Basic .NET
300943 HOW TO: Create Client Access to Remote Server

Requisitos

Los elementos siguientes describen el hardware, el software, la infraestructura de red, las capacidades, el conocimiento y los Service Pack recomendados que se necesitan:
  • Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server o Windows NT 4.0 Server
  • Visual Studio .NET
En la lista siguiente se describe lo que debe saber antes de realizar estos pasos:
  • Visual Studio .NET
  • Funcionamiento básico de redes

Crear un objeto de servidor remoto mediante transferencia de objetos

El primer paso para crear la aplicación de servidor consiste en crear el objeto de servidor. El objeto de servidor es la instancia que crea la aplicación cliente y con el que se comunica en el equipo servidor. La aplicación cliente lleva esto a cabo a través de un objeto proxy que se crea en el cliente. El objeto de servidor residirá en una biblioteca de clases (DLL) y se llamará HelloServer . En el mismo proyecto también definirá la clase que se transferirá desde el cliente al servidor. Esta clase se llamará ForwardMe . Como desea que se calcule la referencia de la clase ForwardMe por referencia, la clase ForwardMe debe heredarse de MarshalByRefObject.
  1. Abra Visual Studio .NET.
  2. Cree una nueva aplicación de biblioteca de clases y asígnele el nombre ServerClassRef .
  3. Cambie el nombre del archivo Class1.vb a ServerClassRef.vb .
  4. Abra ServerClassValue.vb y agréguele dos clases llamadas HelloServer y ForwardMe , ambas de las cuales se heredan de MarshalByRefObject. La clase HelloServer será la clase principal utilizada por la aplicación cliente. La clase ForwardMe se utilizará para enviar datos del objeto desde el cliente al servidor. El archivo de código ServerClassRef.vb debe ser similar al siguiente:
    Public Class HelloServer
    	Inherits MarshalByRefObject
    
    End Class
    Public Class ForwardMe
    	Inherits MarshalByRefObject
    
    End Class
  5. Agregue a HelloServer un método público llamado HelloMethod que tome un objeto ForwardMe. Utilizará este método para pasar un objeto ForwardMe al servidor. Este método llamará al método CallMe de dicho objeto. La clase HelloServer debe ser similar a la siguiente:
    Public Class HelloServer
        Inherits MarshalByRefObject
    
        Public Sub HelloMethod(ByRef obj As ForwardMe)
            Dim i As Integer
            obj.CallMe()
        End Sub
    End Class
  6. Agregue un método público a la clase ForwardMe. Este método obtendrá el nombre del proceso donde se está ejecutando este código. Puesto que está enviando un archivo de código auxiliar del proxy al servidor y realizando devoluciones de llamadas al cliente (cálculo por referencia), el código se ejecutará en el proceso del cliente.
    Public Class ForwardMe
        Inherits MarshalByRefObject
    
        Public Function CallMe() As Object
            Console.WriteLine("CallMe se ejecutó en: " & _
            Process.GetCurrentProcess.ProcessName.ToString)
        End Function
    
    End Class
  7. Genere el proyecto para crear el ensamblado ServerClassRef.dll.
  8. Cierre y guarde el proyecto.

Crear una aplicación de servidor remoto

Ahora que ha creado el objeto de servidor con el que se comunicará el cliente, debe registrar este objeto con el marco de trabajo Remoting. El registro no incluye sólo el registro del objeto, sino también iniciar el servidor y hacer que escuche en un puerto a los clientes que se conectan. Para esto necesita un tipo de proyecto que genere un archivo ejecutable. La razón para incluir el objeto de servidor en un proyecto independiente es que se pueda hacer fácilmente referencia al objeto de servidor desde el cliente. Si lo incluyó en este proyecto no podrá hacer referencia a él, ya que las referencias sólo se pueden establecer en archivos DLL.
  1. Abra Visual Studio .NET.
  2. Por simplificar, cree una nueva aplicación de consola para iniciar el servidor remoto y asígnele el nombre ServerObjectRef .
  3. Cambie el nombre del archivo creado de manera predeterminada de Module1.vb a ServerObjectRef.vb .
  4. Agregue al proyecto una referencia al espacio de nombres System.Runtime.Remoting.
  5. Agregue una referencia al ensamblado ServerClassRef.dll que creó en la sección anterior.
  6. Utilice la instrucción Imports de los espacios de nombres Remoting, Remoting.Channels y Remoting.Channels.TCP de forma que no tenga que suministrar declaraciones de dichos espacios de nombres más adelante en el código. Debe utilizar la instrucción Imports antes que cualquier otra declaración:
    Imports System.Runtime.Remoting
    Imports System.Runtime.Remoting.Channels
    Imports System.Runtime.Remoting.Channels.TCP
  7. Declare una variable para inicializar un objeto TcpChannel que escuchará a los clientes que se conecten en un puerto determinado, en este caso el puerto 8085. Registre el canal que el cliente utilizará para comunicarse con los servicios de canal mediante el método RegisterChannel. Agregue el código de declaración al procedimiento Main de Module1:
    Dim chan As TcpChannel = New TcpChannel(8085)
    ChannelServices.RegisterChannel(chan)
  8. Registre el objeto ServerClassRef con el marco de trabajo Remoting llamando al método RegisterWellKnownType del objeto RemotingConfiguration. Debe especificar lo siguiente:
    1. El nombre de tipo completo del objeto que se va a registrar, en este caso ServerClassRef.HelloServer , seguido del nombre del ensamblado, ServerClassRef. Debe especificar tanto el nombre del espacio de nombres como el nombre de la clase. Como no especificó un espacio de nombres en la sección anterior, se utilizará el espacio de nombres raíz predeterminado.
    2. Después, proporcione el nombre del extremo en el que se publicará el objeto. Los clientes necesitan conocer este nombre para conectarse al objeto. Utilice RemoteTestRef .
    3. El parámetro final especifica el modo de objeto, que puede ser SingleCall o Singleton . Este ejemplo especifica SingleCall . El modo de objeto especifica la duración del objeto cuando se activa en el servidor. En el caso de los objetos SingleCall, se crea una nueva instancia de la clase para cada llamada realizada por un cliente, aunque el mismo cliente llame al mismo método más de una vez. Por el contrario, los objetos Singleton se crean sólo una vez y todos los clientes se comunican con el mismo objeto:
      RemotingConfiguration.RegisterWellKnownServiceType( _
       Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
       "RemoteTestRef", _
       WellKnownObjectMode.SingleCall)
  9. Mantenga la aplicación de servidor en ejecución mediante el método ReadLine del objeto Console:
    Console.WriteLine("Presione <ENTRAR> para salir...")
    Console.ReadLine()
  10. Genere el proyecto.
  11. Cierre y guarde el proyecto.

Crear un cliente a un servidor remoto mediante transferencia de objetos

  1. Abra Visual Studio .NET.
  2. Cree una nueva aplicación de consola y asígnele el nombre ClientAppRef .
  3. Cambie el nombre del archivo creado de manera predeterminada de Module1.vb a ClientAppRef.vb .
  4. Agregue al proyecto una referencia al espacio de nombres System.Runtime.Remoting.
  5. Agregue una referencia al ensamblado ServerClassRef.dll que creó anteriormente en este documento.
  6. Utilice la instrucción Imports de los espacios de nombres Remoting, Remoting.Channels y Remoting.Channels.TCP de forma que no tenga que suministrar declaraciones de dichos espacios de nombres más adelante en el código. Debe utilizar la instrucción Imports antes que cualquier otra declaración:
    Imports System.Runtime.Remoting
    Imports System.Runtime.Remoting.Channels
    Imports System.Runtime.Remoting.Channels.TCP
  7. Declare una variable para inicializar un objeto TcpChannel que el cliente utilizará para conectarse a la aplicación de servidor. Debe especificar el puerto al inicializar el objeto TcpChannel para permitir la comunicación bidireccional. Esto es necesario porque está calculando la referencia a un objeto por referencia y el servidor necesita realizar devoluciones de llamadas al cliente. Lo hará mediante este puerto. El puerto debe ser distinto del que se utilizará para enviar datos. Registre el canal con los servicios de canal mediante el método RegisterChannel. En segundo lugar, debe inicializar un nuevo objeto ForwardMe, que se transferirá al servidor remoto. Agregue el código de declaración al procedimiento Main de Module1:
    Dim chan As TcpChannel = New TcpChannel(8086)
    ChannelServices.RegisterChannel(chan)
    Dim objForwardMe As New ServerClassRef.ForwardMe()
  8. Ahora puede declarar y crear una instancia del servidor remoto. En este caso creará una instancia del objeto HelloServer mediante el método GetObject del objeto Activator. Debe especificar lo siguiente:
    1. El nombre de tipo completo del objeto que se va a registrar, en este caso ServerClassRef.HelloServer , seguido del nombre del ensamblado ServerClassRef . Debe especificar aquí tanto el nombre del espacio de nombres como el nombre de la clase. Como no especificó un espacio de nombres en la sección anterior, se utilizará el espacio de nombres raíz predeterminado.
    2. El identificador de recursos uniforme (URI) del objeto que necesita activar. El URI debe incluir el protocolo (tcp), el nombre del equipo (localhost), el puerto (8085) y el extremo del objeto de servidor (RemoteTestRef). Utilice el identificador URI "tcp://localhost:8085/RemoteTestRef" para tener acceso al servidor remoto ServerClass.
      Dim objHelloServer As ServerClassRef.HelloServer
      
      objHelloServer = CType(Activator.GetObject( _
          Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
          "tcp://localhost:8085/RemoteTestRef"), _
          ServerClassRef.HelloServer)
      If objHelloServer Is Nothing Then
          Console.WriteLine("No se encuentra el servidor")
      Else
          'Ver el paso siguiente
      End If
  9. Si se crea correctamente la instancia del objeto de servidor, puede llamar al método del objeto de servidor, pasando el objeto objForwardMe recién creado. La cadena modificada debe devolverse como un resultado, por lo que deseará mostrar esto:
    Dim objHelloServer As ServerClassRef.HelloServer
    
    objHelloServer = CType(Activator.GetObject( _
    	Type.GetType("ServerClassRef.HelloServer, ServerClassRef"), _
    	"tcp://localhost:8085/RemoteTestRef"), _
    	ServerClassRef.HelloServer)
    If objHelloServer Is Nothing Then
    	Console.WriteLine("No se encuentra el servidor")
    Else
    	objHelloServer.HelloMethod(objForwardMe)
    End If
  10. Mantenga la aplicación cliente en ejecución mediante el método ReadLine del objeto Console:
    Console.WriteLine("Presione <ENTRAR> para salir...")
    Console.ReadLine()
  11. Genere el proyecto.
  12. Asegúrese de que la aplicación de servidor está en ejecución.
  13. Ejecute el proyecto y pruebe la comunicación entre el cliente y el servidor. Debe ver el resultado en la ventana de consola del cliente. Como está calculando la referencia a un objeto por referencia, las devoluciones de llamadas se realizan en el cliente.

REFERENCIAS

Introducción a .NET Remoting (Manual del programador de .NET Framework)

Clase TcpChannel (biblioteca de clases de .NET Framework)

Ejemplos de .NET Framework: Remoting
http://msdn.microsoft.com/library/techart/remoting.htm
Microsoft .NET Remoting: A Technical Overview (Beta 1 .NET Development [General] Technical Articles):
http://msdn.microsoft.com/library/techart/hawkremoting.htm
Método Activator.GetObject (biblioteca de clases de .NET Framework)

Método Type.GetType (biblioteca de clases de .NET Framework)

Método RegisterWellKnownServiceType (biblioteca de clases de .NET Framework)

Propiedades

Id. de artículo: 301112 - Última revisión: lunes, 24 de febrero de 2014 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palabras clave: 
kbnosurvey kbarchive kbhowto kbhowtomaster KB301112

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com