Maestros de VB VB, vengan y echen un vistazo~
/06/0407/14/2e 46 bb 930009159s html
Escribir un programa de chat en línea con control WinSock en VB5
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 le permite crear y mantener conexiones con Las computadoras se conectan. 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) y el puerto en el que 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 de escucha. El evento ConnectionRequest ocurre cuando la computadora cliente necesita conectarse. Para completar la conexión, puede llamar al método Accept en el evento ConnectionRequest.
Una vez establecida la conexión, cualquier ordenador puede enviar y recibir datos. Para enviar datos, puede llamar al método SendData. El evento DataArrival ocurre cuando se reciben datos. Puede obtener los datos 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 de TCP, la computadora no establece la conexión. Además, las aplicaciones UDP pueden ser clientes o servidores.
Para transferir datos, primero 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 información. Por lo tanto, la computadora cliente utiliza el método GetData en el evento DataArrival para obtener la información enviada.
1.3 Seleccionar protocolo de comunicación
A la hora de utilizar el control WinSock lo primero que hay que tener en cuenta 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 protocolo TCP es un protocolo de 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:
1. ¿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.
2. ¿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".
3. ¿La transmisión 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.
La selección del protocolo de comunicación se logra configurando el atributo de protocolo de WinSock. 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 del servidor o el nombre de la computadora.
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 Logotipo.
4. Puede encontrar el nombre de la computadora 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.
La propiedad de estado del control winsock.
El valor de configuración del atributo de estado es: constante.
Descripción del valor
Valor predeterminado de Sckclosed 0. Cerrar
Sckopen 1 Abrir
Escuchando 2
Sckconnectionpending 3 La conexión está pendiente
Sckresolvinghost 4 identifica el host.
Sckhostresolved 5 Se ha identificado el host.
Sckconnecting 6 se está conectando.
Sckconnected 7 está conectado.
Sckclosing 8 El par está cerrando la conexión.
Error Sckerror 9
Los valores de dos atributos de estado se utilizan principalmente a continuación: sckClosed.sckConnected.
4) Programación del programa de chat online
4.1 El papel del servidor en el programa.
Como se puede ver en la figura, no existe comunicación directa entre los dos controles winsock en el lado del servidor, ni entre sckServer1 y sckClient2, ni entre sckServer2 y sckClient1. Es decir, si sckClient1 envía un mensaje a sckClient2, el mensaje es primero aceptado por sckServer1 y luego transmitido a la parte de procesamiento de información del programa. La parte de procesamiento de información luego transmite el mensaje procesado a sckServer2 y luego a sckClient2. Y viceversa, de Dallas al auditorio. Entonces, ¿qué hace la parte del servidor que procesa la información?
1. Establece algunos límites en el número de canales de comunicación.
2. Los canales que se cierran después de su uso deben reutilizarse para ahorrar recursos.
3. La información del paquete transmitido debe distinguirse para diferentes procesamientos.
Se puede distinguir información diferente según el encabezado de los datos descomprimidos.
Hay dos formas de chatear en línea: una es mediante transmisión; la otra es punto a punto. El modo de transmisión significa que todos los clientes pueden recibir información enviada por un cliente. El modo peer-to-peer significa que un par de clientes que quieren "hablar" abren una "cabaña" especialmente para hablar, y otros clientes no pueden "escuchar" su conversación. En el siguiente programa, veremos cómo usar diferentes encabezados de datos (el encabezado para datos punto a punto es "PT" y no hay encabezado para el modo transmisión) para distinguir si el usuario quiere hablar en modo transmisión o modo punto a punto.
4.2 Programa cliente
1. Cree un nuevo proyecto en el ordenador cliente y asígnele el nombre "ClientPrj".
2. Asigne al formulario predeterminado el nombre 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 el control ListBox en frmClient. Nómbrelo lstReceive.
6. Agregar 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.
Private Sub cmdConnect_Click()
Ir al mensaje de error cuando ocurre un error
sckClient. Conexión
Conector de salida
Mensaje de error:
MsgBox "¡El servidor no está abierto o hay un error de red!"
Fin
Conector final
Sub cmdSent_Click()
sckClient. Enviar datos txtEnviado. Texto
Conector final
Private subform_Load()
RemoteComputerName es el nombre de la computadora o la dirección IP del servidor.
sckCliente. RemoteHost = "RemoteComputerName "
sckClient. Puerto remoto = 1000
End Sub
Private Sub sckClient_Close()
MsgBox "¡Canal del servidor cerrado!"
Fin
Conector final
Sub privado sckClient_Connect()
MsgBox "¡Conexión exitosa!"
cmdConnect. enable=false
Conector final
Cliente Sub sck privado _ llegada de datos (ByVal bytes total As Long)
Atenuar s como cadena
sckCliente. GetData s
lstReceive.
Elementos adicionales
Conector final
Cliente Sub sck privado _ Error (ByVal El número es un número entero, Descripción es una cadena, ByVal Scode es largo, _ ByVal Fuente es una cadena, ByVal HelpFile es String, ByVal HelpContext es Long, CancelDisplay es Boolean)
sckClient. Cerrar
cmdConnect. Enable = true
Conector final
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, llamados "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 es un número entero
Subform_Load() privado
Marcar I como un número entero
p>
MaxChan = 10
Para i = 1 a MaxChan - 1
Cargar sckServer(i)
Siguiente yo
sckEscuchar. puerto local = 1000
sckListen. Escuchar
Conector final
Sub privado sckBusy_Close()
sckBusy. Cerrar
Conector final
sub sck privado ocupado _ llegada de datos (ByVal bytes total As Long)
SckBusy. SendData "El servidor está ocupado, ¡conéctese más tarde!"
Actividades múltiples
Conector final
Sub sck privado escucha _ solicitud de conexión (el ID de solicitud de ByVal es largo )
Marcar I como un número entero
Determina qué Winsock aceptará la solicitud.
Para i = 0 a MaxChan - 1
si sckServer(i). Entonces status = 0
Salir para...
Terminará si...
Siguiente yo
Si sckServer(i ). Entonces estado = 0
sckServer(i). Aceptar requestID
Salir del conector
Finalizar si...
Si todos los Winsocks se agotan, un Winsock especial "ocupado" aceptará la solicitud en caso de que La solicitud del usuario no recibe respuesta.
sckOcupado. Cerrar
sckBusy.
Aceptar requestID
Conector final
privado Sub sck listening _ Error(ByVal El número es un número entero, La descripción es una cadena, ByVal Scode es largo, _ ByVal La fuente es una cadena, ByVal HelpFile es String, ByVal HelpContext es Long, CancelDisplay es Boolean)
sckListen. Cerrar
sckListen. puerto local = 1000
sckListen. Escuchar
Conector final
Sub privado sckServer_Close(índice como entero)
sckServer(índice). Cerrar
Conector final
servidor Sub sck privado _ llegada de datos (el índice es un número entero, ByVal bytesTotal es un entero largo)
Atenuar s como una cadena
Marcar I como un número entero
sckServer (índice). GetData s
Ifucase (left (trim(s), 2)) = "pt" y luego 'determina si es un método susurrado, punto a punto.
Si esNumeric(Mid(Trim(s), 3, 1)) entonces
i = Mid(Trim(s), 3, 1)
sckServer(i). Enviar canal de datos. Exponentes y exponentes. ” amp derecha (recortar), disparo (recortar) - 3)
Actividades múltiples
Terminará si...
Modo de transmisión "otro" p> p>
Para i = 0 a MaxChan - 1
Utilice la propiedad State de winsock para enviar un mensaje a todos los clientes conectados al servidor
Si sckServer(i) Luego, status = 7
sckServer(i). Enviar datos al canal e indexar amp trim
Varias actividades
finalizarán si p><. p>Siguiente I
Terminará si...
lstReceive. Agregar canal de elemento. Exponentes y exponentes. ”amp trim
Conector final
servidor Sub sck privado _ Error (el índice es un número entero, el número ByVal es un número entero, la descripción es una cadena, _
ByVal Scode es Long, la fuente de ByVal es String, el archivo de ayuda de ByVal es String, el contexto de ayuda de ByVal es _
Long, cancelar se muestra como un valor booleano)
sckServer ( índice) Cerrar
Conector final
Se puede ver en el programa: Primero, el número de canales está limitado en el programa (10 canales). La propiedad de estado del control WinSock es 0 (estado cerrado), reutilice el control WinSock cerrado. En tercer lugar, al agregar encabezados a la información enviada por el control WinSock, la información se puede procesar de manera diferente (si agrega "PT" (Privado). Chat) "Número de canal" antes de la información en el encabezado del programa, puede saber que el cliente quiere "susurrar" con otro cliente que tiene este "número de canal", de lo contrario la información se enviará a todos los clientes a través de la transmisión) p>
5) Conclusión
El control WinSock no solo se usa para escribir programas de chat en línea, sino que también se puede usar para escribir varios juegos en línea o programas de comunicación en red.
De hecho, el control WinSock es una poderosa herramienta para compilar varios programas C/S. En el uso real, los controles WinSock generalmente están encapsulados en clases de componentes Activex DLL (en proceso) y Activex EXE (fuera de proceso) (a los que se hace referencia en clases). Al distinguir diferentes encabezados delante de la información transmitida, el comando RaiseEvent activa diferentes eventos y luego los eventos se procesan por separado. Esto no solo mejora la depuración y la seguridad del programa, sino que también se ajusta a las características de los métodos de programación basados en eventos.