Código fuente para enviar mensajes a través de LAN
-
Uso del control Winsock
El control WinSock se puede utilizar para establecer una conexión con un ordenador remoto y transmitirla a través del protocolo de datagramas de usuario (UDP). ) o el protocolo de control de transmisión (TCP) intercambia datos. Ambos protocolos se pueden utilizar para crear aplicaciones de cliente y servidor. Al igual que los controles del temporizador, los controles de WinSock son invisibles en tiempo de ejecución.
Posibles usos
Crear aplicaciones cliente que recopilen información del usuario y envíen la información recopilada a un servidor central.
Cree una aplicación de servidor que sirva como punto de importación para datos de múltiples usuarios.
Crear una aplicación de chat.
Elegir protocolo de comunicación
Al utilizar el control WinSock, lo primero que hay que considerar es qué protocolo utilizar. Los protocolos que se pueden utilizar incluyen TCP y UDP. La diferencia importante entre estos dos protocolos es su estado de conexión:
El control del protocolo TCP es un protocolo basado en conexión, comparable al sistema telefónico. Antes de que pueda comenzar la transferencia de datos, el usuario debe establecer una conexión.
El protocolo UDP es un protocolo sin conexión, y la transmisión entre dos ordenadores es similar a la entrega de correo: los mensajes se envían de un ordenador a otro, pero no existe una conexión clara entre ellos. Además, la cantidad máxima de datos transferidos a la vez depende de la red específica.
La elección de qué protocolo suele estar determinada por la aplicación que se desea crear. Las siguientes preguntas ayudarán a seleccionar el protocolo adecuado:
¿Necesita la aplicación obtener información de confirmación del cliente o servidor al enviar y recibir datos? Si es necesario, utilice el protocolo TCP para establecer una conexión clara antes de enviar y recibir datos.
¿La cantidad de datos es particularmente grande (como imágenes y archivos de sonido)? Una vez establecida la conexión, el protocolo TCP mantiene la conexión y garantiza la integridad de los datos. Sin embargo, esta conexión requiere más recursos informáticos, por lo que resulta "cara".
¿La transferencia de datos es intermitente o dentro de una sesión? Por ejemplo, si una aplicación necesita notificar a la computadora cuando se completa una tarea, el protocolo UDP es más adecuado. El protocolo UDP es adecuado para enviar pequeñas cantidades de datos.
Configuración de protocolo
En tiempo de diseño, puede configurar el protocolo utilizado por su aplicación de la siguiente manera: Haga clic en Protocolo en la ventana Propiedades y seleccione sckTCPProtocol o sckUDPProtocol. También puede utilizar el código del programa para configurar las propiedades del protocolo, de la siguiente manera:
Winsock1. Protocol = sckTCPProtocol
Determinar el nombre de la computadora
Al conectarse a una computadora remota, necesita saber su dirección IP o su "bonito nombre". Una dirección IP es una serie de números, cada tres números en grupos separados por puntos (como XXX. XXX. XXX). Normalmente, lo más fácil de recordar es el "bonito nombre" de la computadora.
Para determinar el nombre de su computadora, siga estos pasos:
En la barra de tareas de la computadora, haga clic en Inicio.
En el elemento Configuración, haga clic en Panel de control.
Haz doble clic en el icono de red.
Haga clic en la pestaña Identidad.
Puedes encontrar el nombre de tu computadora en el cuadro Nombre de la computadora.
El nombre de la computadora que se encuentra arriba se puede usar como valor de la propiedad RemoteHost.
Conexión TCP preliminar
Si una aplicación quiere utilizar el protocolo TCP, primero debe decidir si la aplicación es un servidor o un cliente. Si desea crear un lado del servidor, entonces la aplicación debe "escuchar" en el puerto especificado. Cuando un cliente emite una solicitud de conexión, el servidor puede aceptar la solicitud y establecer la conexión. Una vez establecida la conexión, el cliente y el servidor pueden comunicarse entre sí libremente.
Los siguientes pasos crean un servidor muy simple:
Para crear un servidor TCP, siga estos pasos:
Cree un nuevo proyecto EXE estándar.
Cambie el nombre del formulario predeterminado a frmServer.
Cambie el título del formulario a "Servidor TCP".
Coloque un control Winsock en el formulario y cambie su nombre a tcpServer.
Agrega dos controles TextBox al formulario. Nombra al primero txtSendData y al segundo txtOutput.
Añade el siguiente código al formulario.
Private subform_Load()
Establece la propiedad LocalPort en un número entero.
Luego llama al método Listen.
tcpServer. Puertolocal = 1001
servidortcp. Escuchar
"Mostrar" muestra el formulario del lado del cliente.
Conector final
Servidor TCP secundario privado _ solicitud de conexión _
(ByVal requestID es largo)
Compruebe si la propiedad State de el control está cerrado.
Si no,
cierre esta conexión antes de aceptar una nueva.
Si tcpServer. Estado lt gtsckClosed Luego _
tcpServer. Cerrar
Acepta parámetros con requestID.
Conéctate.
tcpServer. Aceptar requestID
Conector final
Sub privado txtSendData_Change()
En un control TextBox llamado txtSendData.
Contiene los datos a enviar. Cuando el usuario ingresa el cuadro de texto
Utilice el método SendData al escribir datos.
Enviar la cadena de entrada.
tcpServer. Enviar datos txtSendData. Texto
Conector final
Sub privado tcpServer_DataArrival _
(ByVal bytesTotal es largo)
Declara una variable para los datos entrantes.
Llame al método GetData y nombre los datos txtOutput.
La propiedad de texto del cuadro de texto.
Atenuar strData como cadena
tcpServer. GetData strData
txtOutput. Text = strData
Conector final
Los pasos anteriores crean una aplicación de servidor simple. Para que funcione, también debes crear una aplicación cliente.
Para crear un cliente TCP, siga estos pasos:
Agregue un nuevo formulario al proyecto y asígnele el nombre frmClient.
Cambie el título del formulario a "Cliente TCP".
Agregue un control Winsock al formulario y asígnele el nombre tcpClient.
Agregue dos controles TextBox a frmClient. Nombra al primero txtSend y al segundo txtOutput.
Coloque un control CommandButton en el formulario y asígnele el nombre cmdConnect.
Cambie el título del control CommandButton a Conectar.
Añade el siguiente código al formulario.
Es importante cambiar el valor de la propiedad RemoteHost por el nombre de su computadora.
Private subform_Load()
El nombre del control Winsock es tcpClient.
Nota: Para especificar un host remoto, puede utilizar
o utilizar una dirección IP (por ejemplo: "121.11.1").
Los "nombres bonitos" para ordenadores son los siguientes.
tcpCliente. RemoteHost = "RemoteComputerName "
tcpClient. RemotePort = 1001
Conector final
Sub cmdConnect_Click()
Llame al método Connect para inicializar la conexión.
tcpCliente. Conexión
Conector final
Sub privado txtSendData_Change()
tcpClient. Enviar datos txtEnviar. Texto
Conector final
Sub privado tcpClient_DataArrival _
(ByVal bytesTotal es largo)
Dim strData como cadena
tcpCliente. GetData strData
txtOutput. Text = strData
Conector final
El código anterior crea una aplicación cliente/servidor simple. Podemos ejecutar ambos: ejecute el proyecto y haga clic en Conectar. Escriba texto en el cuadro de texto txtSendData de uno de los dos formularios y podrá ver que el mismo texto aparecerá en el cuadro de texto txtOutput del otro formulario.
Aceptar múltiples solicitudes de conexión
El servidor básico diseñado anteriormente solo puede aceptar una solicitud de conexión. Al crear una matriz de control, un control también puede aceptar múltiples solicitudes de conexión al mismo tiempo. Con este método, no necesita cerrar la conexión, simplemente cree una nueva instancia de control (estableciendo su propiedad de índice) y luego llame al método Accept en la nueva instancia.
El siguiente código supone que hay un control Winsock en el formulario llamado sckServer y que su propiedad Index está establecida en 0, por lo tanto, el control es parte de una matriz de controles; En la sección de declaración, se declara una variable a nivel de módulo intMax. En el evento Load del formulario, intMax se establece en 0 y la propiedad LocalPort del primer control de la matriz se establece en 1001. Luego llame al método Listen del control para convertirlo en un control de "escucha". Cuando llega una solicitud de conexión, el código detectará si el índice es 0 (el valor del control de "escucha"). Si es 0, el control de escucha incrementará el valor de intMax y creará una nueva instancia de control con ese valor. Luego, use la nueva instancia de control para aceptar la solicitud de conexión.
IntMax privado siempre que
Subform_Load() privado
intMax = 0
sckServer(0). Puertolocal = 1001
sckServer(0).
Escuchar
Conector final
Servidor privado Sub sck _ solicitud de conexión _
(El índice es un número entero, ByVal requestID es un entero largo)
Si índice = 0, entonces
intMax = intMax 1
Cargar sckServer(intMax)
sckServer(intMax). puerto local = 0
sckServer(intMax). Aceptar requestID
Cargar txtData(intMax)
Finalizar si...
Finalizar conector
UDP preliminar
Crear aplicaciones UDP es más fácil que crear aplicaciones TCP porque el protocolo UDP no requiere una conexión explícita. En la aplicación TCP anterior, un control Winsock debe "escuchar" explícitamente y el otro debe usar el método Connect para inicializar la conexión.
El protocolo UDP no requiere conexión explícita. Para enviar datos entre dos controles, debe completar los siguientes tres pasos (en ambos lados de la conexión):
Establezca la propiedad RemoteHost con el nombre de la otra computadora.
Establezca la propiedad RemotePort en la propiedad LocalPort del segundo control.
Llame al método Bind para especificar el LocalPort a utilizar. (Este método se analizará en detalle a continuación).
Debido a que el estado de las dos computadoras puede considerarse "igual", este tipo de aplicación también se denomina peer-to-peer. Para ilustrar este problema, Crearemos una aplicación de "Chat" a través de la cual dos personas podrán tener una conversación en tiempo real.
Para crear un socio UDP, siga estos pasos:
Cree un nuevo proyecto EXE estándar.
Cambie el nombre del formulario predeterminado a frmPeerA.
Cambie el título de la tabla a "Hermano A".
Coloque un control Winsock en el formulario y asígnele el nombre udpPeerA.
En la página Propiedades, haga clic en Protocolo y cambie el protocolo a UDPProtocol.
Agrega dos controles TextBox al formulario. Nombra al primero txtSend y al segundo txtOutput.
Añade el siguiente código al formulario.
Private subform_Load()
El nombre de este control es udpPeerA.
Con udpPeerA
Importante: Se debe cambiar el valor de RemoteHost.
Cambia el nombre de tu ordenador.
. RemoteHost= "PeerB "
. RemotePort = 1001 'Número de puerto de la conexión.
.bind1002" está vinculado al puerto local.
Termina con...
"show" muestra el segundo formulario.
EndConnector
Private Sub txtSend_Change()
Envía texto mientras escribes
Uppera. p>
(ByVal bytesTotal es largo)
Dim strData como cadena
Upera.GetData strData
txtOutput.
Text = strData
Conector final
Para crear un segundo socio UDP, siga estos pasos:
Agregue un formulario estándar al proyecto.
Cambie el nombre del formulario a frmPeerB.
Cambie el título de la tabla a "Hermano B".
Coloque un control Winsock en el formulario y asígnele el nombre udpPeerB.
En la página Propiedades, haga clic en Protocolo y cambie el protocolo a UDPProtocol.
Agrega dos controles TextBox al formulario. Nombra al primero txtSend y al segundo txtOutput.
Añade el siguiente código al formulario.
Private subform_Load()
El nombre de este control es udpPeerB.
Con udpPeerB
Importante: Debes cambiar el valor de RemoteHost a .
El nombre del ordenador.
. RemoteHost= "PeerA "
. RemotePort = 1002 'El puerto al que conectarse.
"Bind 1001" está vinculado al puerto local.
Termina con
Conector final
Sub privado txtSend_Change()
Envía texto inmediatamente después de escribir.
udpPeerB. Enviar datos txtEnviar. Texto
Conector final
Sub privado udpPeerB_DataArrival _
(ByVal bytesTotal es largo)
Dim strData como cadena
udpPeerB. GetData strData
txtOutput. Text = strData
Conector final
Si desea probar el ejemplo anterior, presione F5 para ejecutar el proyecto y luego escriba algo de texto en el cuadro de texto txtSend de ambos formularios. El texto que escriba aparecerá en el cuadro de texto txtOutput de otro formulario.
Acerca del método de enlace
En el código anterior, es necesario llamar al método Bind al crear una aplicación UDP. El método Bind se utiliza para "reservar" un puerto local para el control. Por ejemplo, si un control se vincula al puerto 1001, otras aplicaciones no podrán "escuchar" en ese puerto. Este enfoque evita que otras aplicaciones utilicen el mismo puerto.
El segundo parámetro del método Bind es opcional. Si tiene varios adaptadores de red en su computadora, puede usar el parámetro LocalIP para especificar qué adaptador usar. Si omite este parámetro, el control utiliza el primer adaptador que aparece en el cuadro de diálogo Panel de control de red de Configuración del panel de control de su computadora.
Al utilizar el protocolo UDP, puede cambiar las propiedades de RemoteHost y RemotePort a voluntad y permanecer siempre vinculado al mismo LocalPort. El protocolo TCP es diferente a esto. La conexión debe cerrarse antes de cambiar las propiedades de RemoteHost y RemotePort.