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.
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.
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
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:
Cree una canalización con nombre.
Llame a la función ConnectNamedPipe para bloquear el servidor hasta que se conecte un cliente.
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.
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:
Inicie Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
En el menú Archivo, seleccione Nuevo y a continuación, haga clic en Proyecto.
En Tipos de proyecto, haga clic en Proyectos de Visual Basic y a continuación, haga clic en Aplicación para Windows en Plantillas.
Nota En Visual Studio 2005, haga clic en Visual Basic en Tipos de proyecto.
En el cuadro Nombre, escriba MyServerApp y a continuación, haga clic en Aceptar. De forma predeterminada, se crea un formulario que se denomina Form1.
Agregue tres controles Button al formulario Form1.
En el menú Ver, haga clic en Ventana Propiedades.
Establezca la propiedad Text de los controles Button en los valores siguientes:
Contraer esta tablaAmpliar esta tabla
Nombr
Text
Button1
Cree una canalización con nombre
Button2
Espere para las conexiones de cliente
Button3
Desconecte el servidor
Agregue un control Label al formulario Form1. El control Label Label1 se agrega al formulario Form1.
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:
En Explorador de soluciones, haga clic con el botón secundario en MyServerApp, seleccione Agregar y a continuación, haga clic en Agregar módulo.
En el cuadro de diálogo Add New Item - MyServerApp, haga clic en Abrir.
Agregue el código siguiente al módulo Module1.vb:
Public Const FILE_ATTRIBUTE_NORMAL As Short = &H80S
Public Const FILE_FLAG_NO_BUFFERING As Integer = &H20000000
Public Const FILE_FLAG_WRITE_THROUGH As Integer = &H80000000
Public Const PIPE_ACCESS_DUPLEX As Short = &H3S
Public Const PIPE_READMODE_MESSAGE As Short = &H2S
Public Const PIPE_TYPE_MESSAGE As Short = &H4S
Public Const PIPE_WAIT As Short = &H0S
Public Const INVALID_HANDLE_VALUE As Short = -1
Declare 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 Integer
Declare Function ConnectNamedPipe Lib "kernel32" _
(ByVal hNamedPipe As Integer, ByVal lpOverlapped As Integer) As Integer
Declare Function DisconnectNamedPipe Lib "kernel32" _
(ByVal hNamedPipe As Integer) As Integer
Declare 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 Integer
Declare 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 Integer
Declare Function FlushFileBuffers Lib "kernel32" _
(ByVal hFile As Integer) As Integer
Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Integer) As Integer
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:
En Explorador de soluciones, haga clic con el botón secundario en Form1 y a continuación, haga clic en Abrir.
En vista Diseño del formulario Form1, haga doble clic en Create a named pipe y a continuación, agregue el código siguiente al procedimiento Button1 Click:
Dim openMode, pipeMode As Integer
'Create the named pipe
openMode = PIPE_ACCESS_DUPLEX Or FILE_FLAG_WRITE_THROUGH
pipeMode = PIPE_WAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGE
hPipe = CreateNamedPipe(pipeName, openMode, pipeMode, 10, 10000, 2000, 10000, IntPtr.Zero)
Label1.Text = "Created the named pipe and waiting for the clients."
Button1.Visible = False
Button2.Visible = True
Button3.Visible = True
Agregue el código siguiente antes del procedimiento Button1 Click:
Private Const pipeName As String = "\\.\pipe\MyPipe"
Private Const BUFFSIZE As Short = 10000
Private Buffer(BUFFSIZE) As Byte
Private hPipe As Integer
En Explorador de soluciones, haga doble clic en Form1.vb.
En vista Diseño del formulario Form1, haga doble clic en Wait for the client connections y a continuación, agregue el código siguiente al procedimiento Button2 Click:
Dim byteCount, i, res, cbnCount As Integer
For i = 0 To BUFFSIZE - 1 'Fill an array of numbers
Buffer(i) = i Mod 256
Next i
'Wait for a connection, block until a client connects
Label1.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 = 0
Label1.Text = "Read or Write completed"
Button2.Visible = False
En vista Diseño, haga doble clic en Form1 y a continuación, agregue el código siguiente al procedimiento Form1 Load:
Button2.Visible = False
Button3.Visible = False
En Explorador de soluciones, haga doble clic en Form1.vb.
En vista Diseño del formulario Form1, haga doble clic en Disconnect the server y a continuación, agregue el código siguiente al procedimiento Button3 Click:
Dim res As Integer
'Close the pipe handle when the client makes no requests
CloseHandle(hPipe)
Label1.Text = "Disconnected the named pipe"
En el menú Generar, haga clic en Generar solución.
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:
Llame a la función CreateFile para crear un identificador a la canalización con nombre.
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 CloseHandle en el identificador creado en la función CreateFile.
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 TransactNamedPipe o la función CallNamedPipe para realizar las transacciones de canalización con nombre.
En este ejemplo del código, utiliza la función CallNamedPipe 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.
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:
Inicie Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
En el menú Archivo, seleccione Nuevo y a continuación, haga clic en Proyecto.
En Tipos de proyecto, haga clic en Proyectos de Visual Basic y a continuación, haga clic en Aplicación para Windows en Plantillas.
Nota En Visual Studio 2005, haga clic en Visual Basic en Tipos de proyecto.
En el cuadro Nombre, escriba MyClientApp y a continuación, haga clic en Aceptar. De forma predeterminada, se crea un formulario que se denomina Form1.
Agregue un control Button al formulario Form1.
Haga clic con el botón secundario en Button1 y a continuación, haga clic en Propiedades.
Establezca la propiedad Text a Connect to the server.
Agregue un control Label al formulario Form1. El control Label Label1 se agrega a formulario Form1.
Establezca la propiedad de control Label Label1 en False Visible.
Agregue dos control TextBox al formulario Form1.
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 CallNamedPipe. Una vez que se conecte al servidor, el CallNamedPipe 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:
En vista Diseño, haga doble clic en Connect to the server y a continuación, agregue el código siguiente al procedimiento Button1 Click:
Dim i, res, cbRead,numBytes As Integer
Dim bArray() As Byte
Dim temp As String
numBytes = CInt(TextBox1.Text)
If numBytes < 0 Then
MessageBox.Show("Value must be at least 0.", MsgBoxStyle.OKOnly)
Exit Sub
End If
If numBytes = 0 Then
Label1.Visible = True
Label1.Text = "The connection to the server is disconnected."
Button1.Visible = False
TextBox1.Visible = False
TextBox2.Visible = False
End If
If numBytes > BUFFSIZE Then
numBytes = BUFFSIZE
End If
ReDim 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 box
If 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 = temp
Else
MessageBox.Show("Error number " & Err.LastDllError & _
"while trying to call the CallNamedPipe function.", MsgBoxStyle.OKOnly)
End If
Agregue el código siguiente antes del procedimiento Button1 Click:
Private Const pipeName As String = "\\.\pipe\MyPipe"
Private Const BUFFSIZE As Integer = 10000
Private hpipe As Integer
Public Const INVALID_HANDLE_VALUE As Short = -1
Public 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
En el menú Generar, haga clic en Generar solución.
Compruebe que el código funciona
Para comprobar que funciona su código, siga estos pasos:
Para iniciar la aplicación de servidor, haga clic en Iniciar en el menú Depuración del proyecto MyServerApp.
En el formulario Form1, haga clic en Create a named pipe y a continuación, haga clic en Wait for the client connections. Ahora, la aplicación se bloquea y espera conexión del cliente.
Para iniciar la aplicación de cliente, haga clic en Iniciar en el menú Depuración del proyecto MyClientApp.
En el formulario Form1, escriba 10 en el cuadro TextBox1 y a continuación, haga clic en Connect to the server. Puede ver la matriz de bytes que se recibe en el cuadro TextBox2.
Para desconectar la aplicación de cliente del servidor, 0 de tipo en el TextBox1 confina la aplicación de cliente y a continuación, hace clic en Connect to the server.
Cierre la aplicación de cliente.
Para desconectar el extremo de servidor de la canalización con nombre y después, cerrar la aplicación de servidor, haga clic en Disconnect the server en el formulario Form1 de las aplicaciones de servidor.
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
¡Muchas gracias! Sus comentarios nos ayudarán a mejorar los contenidos de soporte. Para más opciones de asistencia, visite la página de Ayuda y soporte técnico.