Red de conocimiento informático - Problemas con los teléfonos móviles - Maestros de VB VB, vengan y echen un vistazo~

Maestros de VB VB, vengan y echen un vistazo~

Para obtener más información, consulte lo siguiente:

/06/0407/14/2e 46 bb 930009159s html

Escribir un programa de chat en línea con control WinSock en VB5

Se propusieron sockets en sistemas Unix. Al principio, se utilizó principalmente para comunicaciones locales, pero pronto se aplicó a sistemas C/S. Sobre esta base, Microsoft creó el control WinSock, que se utiliza específicamente en la interfaz de Windows y es totalmente compatible con Sockets. El control Winsock es invisible para el usuario y proporciona una manera conveniente de acceder a los servicios de red TCP y UDP. Los desarrolladores que utilizan Microsoft Access, Visual Basic, Visual C o Visual FoxPro pueden utilizarlo. Para escribir una aplicación de cliente o servidor, no necesita conocer los detalles de TCP ni llamar a las API de Winsock subyacentes. Al configurar las propiedades de un control y llamar a sus métodos, puede conectarse fácilmente a una computadora remota y también intercambiar datos en ambas direcciones. A continuación, utilice 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 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>

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)

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.