Cómo utilizar canalizaciones con nombre para comunicación en Visual Basic . NET o Visual Basic 2005 entre procesos

AVISO: Gracias por utilizar el servicio de Traducción Automática. Este artículo ha sido traducido por un sistema informático sin ayuda humana (Machine Translation). Microsoft ofrece estos artículos a los usuarios que no comprendan el inglés, exclusivamente, con el fin de que puedan entenderlos más fácilmente. Microsoft no se hace responsable de la calidad lingüística de las traducciones ni de la calidad técnica de los contenidos de los artículos así como tampoco de cualesquiera problemas, directos o indirectos, que pudieran surgir como consecuencia de su utilización por los lectores.

Haga clic aquí para ver el artículo original (en inglés): 871044
Resumen
En este artículo paso a paso se describe cómo utilizar canalizaciones con nombre en Microsoft Visual Basic . NET o Microsoft Visual Basic 2005 para comunicación entre procesos. Este Este artículo incluye un ejemplo del código que muestra comunicación cliente/servidor utilizando unas canalizaciones con nombre en Visual Basic .NET o Visual Basic 2005. El Este artículo describe la comunicación entre procesos creando un servidor de canalización con nombre y un cliente de canalización con nombre. La comunicación por encima de la canalización se realiza de la forma siguiente:
  • Cree una canalización con nombre.
  • Bloquee la aplicación de servidor utilizando la función ConnectNamedPipe hasta que se conecte un cliente.
  • Se conecta al servidor utilizando la función CallNamedPipe.
  • Llame a la función ReadFile o a la función WriteFile para comunicarse por encima de la canalización.
  • Llame a la función DisconnectNamedPipe cuando el proceso termina de usar la canalización.
  • Llame a la función CloseHandle en la canalización con nombre después de completar la comunicación por encima de la canalización.
INTRODUCCIÓN
Una canalización con nombre es una canalización unidireccional o cara para comunicación entre un servidor de canalización y uno o varios clientes de canalización. Puede usuario llamado canalizaciones para proporcionar comunicación entre procesos en el mismo equipo o procesos en equipos diferentes a través de una red. El término que se refiere "denominó servidor de canalización" a un proceso al que se crea una canalización con nombre y al término que se refiere "denominó cliente de canalización" a un proceso al que se conecta a una instancia de una canalización con nombre.

Puede utilizar Microsoft Visual Basic . NET o Microsoft Visual Basic 2005 para crear aplicaciones que se comunican a otros procesos utilizando denominadas canalizaciones. Este Este artículo contiene un Ejemplo de código que utiliza unas canalizaciones con nombre para comunicarse entre dos aplicaciones de Visual Basic . NET o Visual Basic 2005 Windows.

Volver al principi

Requisito

En este artículo se supone que está familiarizado con los temas siguientes
  • Aplicación para Windows
  • Programa Visual Basic .NET
  • Utilizar canalizaciones
En la lista siguiente se describe el hardware, el software, la infraestructura de red y los service pack recomendados que se necesitarán
  • Microsoft Visual Studio .NET o Microsoft Visual Studio 2005
  • Microsoft .NET Framework
Volver al principi

Cree un servidor de canalización con nombre

Para crear un servidor de canalización con nombre y a continuación, comunicarse con el cliente por encima de la canalización, siga estos pasos:
  1. Cree una canalización con nombre.
  2. Llame a la función para bloquear el servidor hasta que se conecte un cliente.
  3. Llame a la función o a la función para comunicarse por encima de la canalización.
  4. Llame a la función cuando el proceso termina de usar la canalización.
  5. Llame a la función en la canalización con nombre.
Volver al principi

Vaya a diseñar una aplicación para Windows que crea un servidor de canalización con nombre

Para ir a diseñar una aplicación para Windows que crea un servidor de canalización con nombre utilizando Visual Basic .NET o Visual Basic 2005, siga estos pasos:
  1. Inicie Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
  2. En el menú , seleccione y a continuación, haga clic en .
  3. En , haga clic en y a continuación, haga clic en en .

    Nota En Visual Studio 2005, haga clic en Visual Basic en Tipos de proyecto.
  4. En el cuadro , escriba y a continuación, haga clic en . De forma predeterminada, se crea un formulario que se denomina Form1.
  5. Agregue tres controles al formulario Form1.
  6. En el menú , haga clic en .
  7. Establezca la propiedad de los controles en los valores siguientes:
    NombrText
    Button1Cree una canalización con nombre
    Button2Espere para las conexiones de cliente
    Button3Desconecte el servidor
  8. Agregue un control al formulario . El control Label1 se agrega al formulario Form1.
Volver al principi

Agregue todas las declaraciones a un módulo en la aplicación para Windows

Para agregar las declaraciones de función que es necesario implementar la comunicación entre procesos utilizando las canalizaciones con nombre, siga estos pasos:
  1. En Explorador de soluciones, haga clic con el botón secundario en , seleccione y a continuación, haga clic en .
  2. En el cuadro de diálogo , haga clic en .
  3. Agregue el código siguiente al módulo :
    Public Const FILE_ATTRIBUTE_NORMAL As Short = &H80SPublic Const FILE_FLAG_NO_BUFFERING As Integer = &H20000000Public Const FILE_FLAG_WRITE_THROUGH As Integer = &H80000000Public Const PIPE_ACCESS_DUPLEX As Short = &H3SPublic Const PIPE_READMODE_MESSAGE As Short = &H2SPublic Const PIPE_TYPE_MESSAGE As Short = &H4SPublic Const PIPE_WAIT As Short = &H0SPublic Const INVALID_HANDLE_VALUE As Short = -1Declare Function CreateNamedPipe Lib "kernel32" Alias "CreateNamedPipeA" _(ByVal lpName As String, ByVal dwOpenMode As Integer, _ByVal dwPipeMode As Integer, ByVal nMaxInstances As Integer, _ByVal nOutBufferSize As Integer, ByVal nInBufferSize As Integer, _ByVal nDefaultTimeOut As Integer, ByVal lpSecurityAttributes As IntPtr _) As IntegerDeclare Function ConnectNamedPipe Lib "kernel32" _    (ByVal hNamedPipe As Integer, ByVal lpOverlapped As Integer) As IntegerDeclare Function DisconnectNamedPipe Lib "kernel32" _    (ByVal hNamedPipe As Integer) As IntegerDeclare Function WriteFile Lib "kernel32" _(ByVal hFile As Integer, ByRef lpBuffer() As Byte, _ByVal nNumberOfBytesToWrite As Integer, ByRef lpNumberOfBytesWritten As Integer, _ByVal lpOverlapped As Integer _) As IntegerDeclare Function ReadFile Lib "kernel32" _(ByVal hFile As Integer, ByRef lpBuffer As Integer, _ByVal nNumberOfBytesToRead As Integer, ByRef lpNumberOfBytesRead As Integer, _ByVal lpOverlapped As Integer _) As IntegerDeclare Function FlushFileBuffers Lib "kernel32" _    (ByVal hFile As Integer) As IntegerDeclare Function CloseHandle Lib "kernel32" _    (ByVal hObject As Integer) As Integer
Volver al principi

Escriba código para crear un servidor de canalización con nombre

Después de crear una canalización con nombre, espere las conexiones del cliente. Cuando el cliente se conecta al servidor, lea o escriba los datos por encima de la canalización. Para ello, siga estos pasos:
  1. En Explorador de soluciones, haga clic con el botón secundario en y a continuación, haga clic en .
  2. En vista Diseño del formulario , haga doble clic en y a continuación, agregue el código siguiente al procedimiento :
    Dim openMode, pipeMode As Integer'Create the named pipeopenMode = PIPE_ACCESS_DUPLEX Or FILE_FLAG_WRITE_THROUGHpipeMode = PIPE_WAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGEhPipe = CreateNamedPipe(pipeName, openMode, pipeMode, 10, 10000, 2000, 10000, IntPtr.Zero)Label1.Text = "Created the named pipe and waiting for the clients."Button1.Visible = FalseButton2.Visible = TrueButton3.Visible = True
  3. Agregue el código siguiente antes del procedimiento :
    Private Const pipeName As String = "\\.\pipe\MyPipe"Private Const BUFFSIZE As Short = 10000Private Buffer(BUFFSIZE) As BytePrivate hPipe As Integer
  4. En Explorador de soluciones, haga doble clic en .
  5. En vista Diseño del formulario Form1, haga doble clic en y a continuación, agregue el código siguiente al procedimiento :
    Dim byteCount, i, res, cbnCount As IntegerFor i = 0 To BUFFSIZE - 1 'Fill an array of numbers   Buffer(i) = i Mod 256Next i'Wait for a connection, block until a client connectsLabel1.Text = "Waiting for client connections"Me.Refresh()Do   res = ConnectNamedPipe(hPipe, 0)   'Read the data sent by the client over the pipe   cbnCount = 4   res = ReadFile(hPipe, byteCount, Len(byteCount), cbnCount, 0)   If byteCount > BUFFSIZE Then 'Client requested for byteCount bytes       byteCount = BUFFSIZE 'but only send up to 20000 bytes   End If   'Write the number of bytes requested by the client    res = WriteFile(hPipe, Buffer, byteCount, cbnCount, 0)   res = FlushFileBuffers(hPipe)   'Disconnect the named pipe.   res = DisconnectNamedPipe(hPipe)   'Loop until the client makes no more requests for data. Loop Until byteCount = 0Label1.Text = "Read or Write completed"Button2.Visible = False
  6. En vista Diseño, haga doble clic en y a continuación, agregue el código siguiente al procedimiento :
    Button2.Visible = FalseButton3.Visible = False
  7. En Explorador de soluciones, haga doble clic en .
  8. En vista Diseño del formulario Form1, haga doble clic en y a continuación, agregue el código siguiente al procedimiento :
    Dim res As Integer'Close the pipe handle when the client makes no requestsCloseHandle(hPipe)Label1.Text = "Disconnected the named pipe"
  9. En el menú , haga clic en .
Volver al principi

Cree un cliente de canalización con nombre

Para crear un cliente de canalización con nombre que se comunica con el servidor, siga estos pasos:
  1. Llame a la función para crear un identificador a la canalización con nombre.
  2. Llame a la función o a la función para comunicarse por encima de la canalización.
  3. Llame a la función en el identificador creado en la función .
También puede utilizar una transacción de canalización con nombre para comunicación cliente/servidor. La transacción de canalización con nombre combina una operación de escritura y una operación de lectura en una operación de red única. Una transacción se puede utilizar sólo en una canalización cara message-type. Los procesos pueden utilizar la función o la función para realizar las transacciones de canalización con nombre.

En este ejemplo del código, utiliza la función para conectarse al servidor de canalización con nombre, escribir los datos en la canalización y a continuación, leer los datos de la canalización.

Volver al principi

Diseñe una aplicación para Windows que se comunica con el servidor de canalización con nombre

Para diseñar una aplicación de Visual Basic . NET o Visual Basic 2005 Windows que se utiliza para conectarse al servidor de canalización con nombre, siga estos pasos:
  1. Inicie Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
  2. En el menú , seleccione y a continuación, haga clic en .
  3. En , haga clic en y a continuación, haga clic en en .

    Nota En Visual Studio 2005, haga clic en Visual Basic en Tipos de proyecto.
  4. En el cuadro , escriba y a continuación, haga clic en . De forma predeterminada, se crea un formulario que se denomina Form1.
  5. Agregue un control al formulario Form1.
  6. Haga clic con el botón secundario en y a continuación, haga clic en .
  7. Establezca la propiedad a .
  8. Agregue un control al formulario Form1. El control Label1 se agrega a formulario .
  9. Establezca la propiedad de control Label1 en .
  10. Agregue dos control TextBox al formulario Form1.
Volver al principi

Escriba código para conectarse al servidor de canalización con nombre

Se conecta al servidor de canalización con nombre utilizando la función . Una vez que se conecte al servidor, el lee la canalización y a continuación, cierra la canalización al escribir función en la canalización. Para conectarse con el servidor, leer o escribir los datos a continuación, siga estos pasos:
  1. En vista Diseño, haga doble clic en y a continuación, agregue el código siguiente al procedimiento :
    Dim i, res, cbRead,numBytes As IntegerDim bArray() As ByteDim temp As StringnumBytes = CInt(TextBox1.Text)If numBytes < 0 Then    MessageBox.Show("Value must be at least 0.", MsgBoxStyle.OKOnly)    Exit SubEnd IfIf numBytes = 0 Then    Label1.Visible = True    Label1.Text = "The connection to the server is disconnected."    Button1.Visible = False    TextBox1.Visible = False    TextBox2.Visible = FalseEnd IfIf numBytes > BUFFSIZE Then    numBytes = BUFFSIZEEnd IfReDim bArray(numBytes) 'Create the return buffer'Call the CallNamedPipe function to do the transactions res = CallNamedPipe(pipeName, numBytes, Len(numBytes), bArray(0), numBytes, cbRead, 30000) 'Wait up to 30 seconds for a response'Format the data received, and then display the data in the text boxIf res > 0 Then    temp = Format(bArray(0), " 000")    For i = 1 To cbRead - 1       If (i Mod 16) = 0 Then temp = temp & vbCrLf          temp = temp & " " & Format(bArray(i), "000")    Next i    TextBox2.Text = tempElseMessageBox.Show("Error number " & Err.LastDllError & _"while trying to call the CallNamedPipe function.", MsgBoxStyle.OKOnly)End If
  2. Agregue el código siguiente antes del procedimiento :
    Private Const pipeName As String = "\\.\pipe\MyPipe"Private Const BUFFSIZE As Integer = 10000Private hpipe As Integer    Public Const INVALID_HANDLE_VALUE As Short = -1Public Declare Function CallNamedPipe Lib "kernel32" Alias "CallNamedPipeA" _(ByVal lpNamedPipeName As String, _ByRef lpInBuffer As Integer, _ByVal nInBufferSize As Integer, _ByRef lpOutBuffer As Byte, _ByVal nOutBufferSize As Integer, _ByRef lpBytesRead As Integer, ByVal nTimeOut As Integer) As Integer
  3. En el menú , haga clic en .
Volver al principi

Compruebe que el código funciona

Para comprobar que funciona su código, siga estos pasos:
  1. Para iniciar la aplicación de servidor, haga clic en en el menú del proyecto MyServerApp.
  2. En el formulario Form1, haga clic en y a continuación, haga clic en . Ahora, la aplicación se bloquea y espera conexión del cliente.
  3. Para iniciar la aplicación de cliente, haga clic en en el menú del proyecto MyClientApp.
  4. En el formulario Form1, escriba en el cuadro y a continuación, haga clic en . Puede ver la matriz de bytes que se recibe en el cuadro .
  5. Para desconectar la aplicación de cliente del servidor, de tipo en el confina la aplicación de cliente y a continuación, hace clic en .
  6. Cierre la aplicación de cliente.
  7. Para desconectar el extremo de servidor de la canalización con nombre y después, cerrar la aplicación de servidor, haga clic en en el formulario Form1 de las aplicaciones de servidor.
Volver al principi
Referencias
Para obtener más información, visite los siguientes sitios Web de Microsoft Developer Network (MSDN)
Transacciones en canalización con nombre
http://msdn2.microsoft.com/en-us/library/aa365789.aspx
Volver al principi

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 871044 - Última revisión: 01/11/2007 06:36:07 - Revisión: 2.4

Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition

  • kbvs2005swept kbvs2005applies kbserver kbpipes kbipc kbclient kbhowtomaster kbhowto KB871044 KbMtes kbmt
Comentarios