¿Cómo utilizar el control de socket en VB6.0?
Utilice el control WinSock en VB5 para escribir un programa de chat en línea
Sockets se propuso en el sistema Unix Al principio, se usaba principalmente para la comunicación local, pero se aplicó rápidamente. a C/ En el sistema S. MicroSoft creó el control WinSock sobre esta base, específicamente para interfaces de Windows y totalmente compatible con Sockets. El control Winsock es invisible para el usuario y proporciona un acceso conveniente a los servicios de red TCP y UDP. Puede ser utilizado por desarrolladores en Microsoft Access, Visual Basic, Visual C o Visual FoxPro. Para escribir aplicaciones de cliente o servidor, no es necesario conocer los detalles de TCP ni llamar a las API de Winsock de bajo nivel. Puede conectarse fácilmente a una máquina remota configurando las propiedades del control y llamando a sus métodos, y también puede intercambiar datos en ambas direcciones. Usemos el control WinSock en VB5 para escribir un programa de chat en línea.
1) Conceptos básicos y selección de protocolos de comunicación de red
1.1 Conceptos básicos de TCP (Protocolo de transferencia de datos)
El protocolo de transferencia de datos permite la creación y mantenimiento de conexiones con Conexión de ordenadores remotos. Conecte dos computadoras para transferir datos entre sí.
Si crea una aplicación cliente, debe conocer el nombre de la computadora del servidor o la dirección IP (propiedad RemoteHost), también debe conocer el puerto de "escucha" (propiedad RemotePort) y luego llamar al método Connect.
Si crea una aplicación de servidor, debe configurar un puerto de escucha (propiedad LocalPort) y llamar al método Listen. El evento ConnectionRequest ocurre cuando una computadora cliente requiere una conexión. Para completar la conexión, llame al método Accept dentro del evento ConnectionRequest.
Una vez establecida la conexión, cualquiera de los ordenadores puede enviar y recibir datos. Para enviar datos, llame al método SendData. El evento DataArrival ocurre cuando se reciben datos. Los datos se pueden obtener llamando al método GetData en el evento DataArrival.
1.2 Conceptos básicos de UDP (Protocolo de datagramas de usuario)
El Protocolo de datagramas de usuario (UDP) es un protocolo sin conexión. A diferencia del funcionamiento TCP, el ordenador no establece la conexión. Además, las aplicaciones UDP pueden ser clientes o servidores.
Para transferir datos, primero se debe configurar la propiedad LocalPort del ordenador cliente. Luego, la computadora servidor simplemente configura RemoteHost en la dirección de Internet de la computadora cliente, establece la propiedad RemotePort en el mismo puerto que la propiedad LocalPort de la computadora cliente y llama al método SendData para comenzar a enviar la información. Luego, la computadora cliente utiliza el método GetData dentro del evento DataArrival para obtener la información enviada.
1.3 Seleccionar protocolo de comunicación
Al utilizar el control WinSock, primero debe considerar qué protocolo utilizar. Los protocolos que se pueden utilizar incluyen TCP y UDP. La diferencia importante entre los dos protocolos es su estado de conexión:
El protocolo TCP es un protocolo de conexión, que se puede comparar con el sistema telefónico. Antes de que pueda comenzar la transferencia de datos, el usuario primero 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 explícita entre ambos.
Además, la cantidad máxima de datos transferidos en una sola transacción depende de la red específica.
La elección de qué protocolo utilizar suele estar determinada por la aplicación que se necesita crear. Las siguientes preguntas ayudarán a elegir el protocolo adecuado:
1. Al enviar y recibir datos, ¿la aplicación necesita obtener información de confirmación del cliente o servidor? Si es necesario, utilice el protocolo TCP para establecer una conexión explícita antes de enviar y recibir datos.
2. ¿La cantidad de datos es particularmente grande (como archivos de imagen y 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 y, por tanto, es más "cara".
3. ¿El envío de datos es intermitente o dentro de una sesión? Por ejemplo, si una aplicación necesita notificar a una computadora cuando se completa una determinada tarea, el protocolo UDP es más apropiado. El protocolo UDP es adecuado para enviar pequeñas cantidades de datos.
La selección del protocolo de comunicación se logra configurando la propiedad Protocolo de WinSock. A continuación, seleccione el protocolo de comunicación TCP para escribir un programa de chat en línea. Antes de hacer esto, debe conocer un parámetro extremadamente importante: la dirección IP o el nombre de la computadora del servidor.
2) Determine el nombre de la computadora
1. En el escritorio de la computadora, haga clic derecho en "Entorno de red".
2. Seleccione "Propiedades".
3. Haga clic en la pestaña Identificación.
4. El nombre de la computadora se puede encontrar en el cuadro "Nombre de la computadora".
Determine la dirección IP de la computadora
1. Haga clic en Inicio en la barra de tareas.
2. Seleccione "Ejecutar".
3. Si el sistema operativo del lado del servidor es win95, complete "winipcfg" en "Abrir". Si el sistema operativo del lado del servidor es winnt, complete "ipconfig" en "Abrir".
4. Presione la tecla "Aceptar".
El nombre de la computadora o la dirección IP que se encuentran arriba se pueden usar como el valor de la propiedad RemoteHost de WinSock.
3) Propiedad estatal de winsock control.
El valor de configuración del atributo de estado es: Constante
Valor Descripción
sckclosed 0 Predeterminado. cerrar
sckopen 1 abrir
scklistening 2 escuchando
sckconnectionpending 3 conexión pendiente
sckresolvinghost 4 identificar host
sckhostresolved 5 Host identificado
sckconnecting 6 Conectando
sckconnected 7 Conectado
sckclosing 8 Los pares están cerrando la conexión
sckerror 9 error p>
Lo siguiente utiliza principalmente los valores de las dos propiedades de estado de sckClosed.sckConnected.
4) Preparación del programa de chat en línea
4.1 El papel del lado del servidor en el programa.
Como se puede ver en el diagrama, no hay comunicación directa entre los dos controles winsock en el lado del servidor. Al mismo tiempo, no hay comunicación directa entre sckServer1 y sckClient2 y sckServer2 y sckClient1.
Esto significa que si sckClient1 envía un mensaje a sckClient2, el mensaje es primero aceptado por sckServer1 y luego sckServer1 pasa el mensaje a la parte de procesamiento de información del programa. La parte de procesamiento de mensajes luego pasa el mensaje procesado a sckServer2 y luego sckServer2 lo pasa. a sckClient2. viceversa. Entonces, ¿qué hace la parte del servidor que procesa la información?
1. Realizar algunas restricciones en el número de canales de comunicación.
2. Los canales que se hayan cerrado después de su uso deben poder reutilizarse para ahorrar recursos.
3. La información del paquete de datos transmitido debe diferenciarse y procesarse de manera diferente.
Se puede distinguir información diferente descomprimiendo el encabezado de los datos.
Existen dos formas de chatear online: la primera es retransmitiendo; la segunda es punto a punto. El método de transmisión significa que todos los clientes pueden recibir la información enviada por un determinado cliente. El método punto a punto significa que un par de clientes que quieren "susurrar" abren especialmente una "cabaña" para conversar y otros clientes no pueden "escuchar" su conversación. En el siguiente programa, verá cómo utilizar diferentes encabezados de datos para distinguir si el usuario quiere hablar en modo transmisión o en modo punto a punto (el encabezado del paquete de datos punto a punto es "PT" y el encabezado de transmisión el modo no tiene encabezado de paquete).
4.2 Programa cliente
1. Cree un nuevo proyecto en el cliente y asígnele el nombre "ClientPrj".
2 Cambie la ventana predeterminada. El cuerpo se llama frmClient. .
3. Cambie el título del formulario a "Cliente".
4. Agregue un control WinSock al formulario y asígnele el nombre tcpClient.
5. Agregue un control ListBox en frmClient. Nómbrelo lstReceive.
6. Agregue un control TextBox en frmClient. Nómbrelo txtSend.
7. Coloque dos controles CommandButton en el formulario y asígneles el nombre cmdConnect y cmdSent.
8. Cambie el título del control cmdConnect a Conectar y cambie el título del control cmdSent a Enviado.
9. Añade el siguiente código al formulario.
Sub privado cmdConnect_Click()
En caso de error Ir a ErrorPro
sckClient.Connect
Salir de Sub
ErrorPro :
MsgBox "¡El servidor no está abierto o hay un error de red!"
End
End Sub
Private Sub cmdSent_Click ()
sckClient.SendData txtSent.Text
End Sub
Private Sub Form_Load()
' RemoteComputerName es el nombre de la computadora o Dirección IP del servidor.
sckClient.RemoteHost = "RemoteComputerName"
sckClient.RemotePort = 1000
End Sub
Sub privado sckClient_Close()
MsgBox "¡El canal del servidor ha sido cerrado!"
End
End Sub
Private Sub sckClient_Connect()
MsgBox " ¡Conexión exitosa! "
cmdConnect.Enabled = False
End Sub
Sub privado sckClient_DataArrival(ByVal bytesTotal As Long)
Dim s como cadena
sckClient.GetData s
lstReceive.AddItem s
End Sub
Private Sub sckClient_Error(ByVal Number As Integer , Descripción como cadena, código ByVal siempre, _ fuente ByVal como cadena, archivo de ayuda ByVal como cadena, contexto de ayuda ByVal siempre, CancelDisplay como booleano)
sckClient.Close
cmdConnect.Enabled = True
End Sub
4.3 Programa del lado del servidor
1 Cree un nuevo proyecto en el lado del servidor y asígnele el nombre "ServerPrj".
2. Asigne al formulario predeterminado el nombre "frmServer".
3. Agregue un control ListBox al formulario y asígnele el nombre "lstReceive".
4. Agregue tres controles WinSock al formulario, asígneles el nombre "sckListen", sckBusy y "sckServer" respectivamente y establezca la propiedad "Index" de "sckServer" en 0.
5. Añade el siguiente código al formulario.
'Número máximo de canales
MaxChan privado como entero
Sub privado Form_Load()
Atenuar i como entero
MaxChan = 10
Para i = 1 Para MaxChan - 1
Cargar sckServer(i)
Siguiente i
sckListen LocalPort = 1000
sckListen.Listen
End Sub
Sub privado sckBusy_Close()
sckBusy.Close
End Sub
Private Sub sckBusy_DataArrival(ByVal bytesTotal As Long)
sckBusy.SendData "El servidor está ocupado, ¡conéctese nuevamente más tarde!"
p>End Sub
Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)
Dim i As Integer
'Determinar qué Winsock acepta la solicitud
For i = 0 To MaxChan - 1
Si sckServer(i).State = 0 Entonces
Salir para
Finalizar si
Siguiente i
Si sckServer(i).State = 0 Entonces
sckServer(i).Aceptar requestID
Salir Sub
p>
End If
'Si todos los Winsocks se agotan, un Winsock "ocupado" dedicado aceptará la solicitud para evitar que las solicitudes de los usuarios no sean respondidas p>
sckBusy.Close
sckBusy.Accept requestID
End Sub
Sub privado sckListen_Error(Número ByVal como entero, descripción como cadena, código ByVal Siempre, _ ByVal Fuente como cadena, ByVal HelpFile como cadena, ByVal HelpContext Mientras, CancelDisplay como booleano)
sckListen.Close
sckListen.LocalPort = 1000
sckListen.Listen
End Sub
Sub privado sckServer_Close(Índice como entero)
sckServer(Índice).Close
Fin Sub
Sub privado sckServer_DataArrival(Índice como entero, por
Val bytesTotal As Long)
Dim s como cadena
Dim i como entero
sckServer(Index).GetData s
If UCase (Left(Trim(s), 2)) = "PT" Luego 'Determinar si es un mensaje privado, modo punto a punto
If IsNumeric(Mid(Trim(s), 3, 1)) Entonces
i = Mid(Trim(s), 3, 1)
sckServer(i).SendData "Channel " & Index & " " & Right(Trim( s), Len (Trim(s)) - 3)
DoEvents
End If
Else 'Método de transmisión
For i = 0 a MaxChan - 1
'Utilice el atributo State de winsock para enviar mensajes a todos los clientes conectados al servidor
Si sckServer(i).State = 7 Entonces
sckServer (i).SendData "Channel " & Index & " " & Trim(s)
DoEvents
End If
Siguiente i
Finalizar si
lstReceive.AddItem "Channel " & Index & " " & Trim(s)
End Sub
Sub privado sckServer_Error(Index Como entero, número ByVal como entero, descripción como cadena, _
ByVal Scode como largo, fuente ByVal como cadena, archivo de ayuda ByVal como cadena, contexto de ayuda ByVal como _
Long, CancelDisplay como Boolean)
sckServer(Index).Close
End Sub
Como puede ver en el programa: Primero, el número de canales está limitado en el programa. (Carretera 10). En segundo lugar, reutilice el control WinSock cerrado determinando si la propiedad State del control WinSock es 0 (estado cerrado). En tercer lugar, al agregar un encabezado a la información transmitida por el control WinSock, la información se procesa de manera diferente (si el encabezado "PT" (Private Talk) "número de canal" se agrega antes de la información en el programa, sabrá lo que el cliente quiere "enviar un mensaje privado" a otro cliente con este "número de canal"; de lo contrario, la información se transmitirá a todos los clientes).
5) Conclusión
El control WinSock no solo se usa para compilar programas de chat en línea, sino que también se puede usar para compilar varios juegos en línea o programas de comunicación en red. De hecho, el control WinSock es una poderosa herramienta para programar varios programas C/S. En el uso real, el control WinSock generalmente está encapsulado en la clase del componente Activex DLL (en proceso) o Activex EXE (fuera de proceso) (al que se hace referencia en la clase).
Al distinguir diferentes encabezados antes de la información transmitida, use el comando RaiseEvent para activar diferentes eventos y luego procese los eventos por separado. Esto no solo aumenta la capacidad de depuración y seguridad del programa, sino que también está más en línea con las características de los métodos de programación basados en eventos.