¿Cómo transferir imágenes usando sockets en vc?
Los sockets se introdujeron en los sistemas Unix e inicialmente se utilizaron principalmente para la comunicación local, pero pronto se aplicaron a los sistemas C/S. En base a esto, MicroSoft creó el control WinSock específicamente para la interfaz de Windows, que es totalmente compatible con Sockets. Invisible para el usuario, el control Winsock proporciona fácil acceso a los servicios de red TCP y UDP y puede ser utilizado por desarrolladores en Microsoft Access, Visual Basic, Visual C o Visual FoxPro. Al escribir una aplicación de cliente o servidor, no necesita conocer los detalles de TCP ni llamar a la API de Winsock de bajo nivel. Puede conectarse fácilmente a una máquina remota e intercambiar datos en ambas direcciones simplemente configurando las propiedades del control y llamando. sus métodos. El siguiente es el proceso de escritura de un programa de chat en línea utilizando el control VB5 WinSock.
1) La base y selección de los protocolos de comunicación de red
1.1 La base del TCP (Protocolo de transferencia de datos)
El protocolo de transferencia de datos permite la creación y mantenimiento de conexiones con ordenadores remotos se conectan. Conecte dos computadoras para transferir datos entre sí.
Si crea una aplicación cliente, debe conocer el nombre o la dirección IP de la computadora servidor (propiedad RemoteHost) y 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 en el evento ConnectionRequest.
Una vez establecida la conexión, cualquier ordenador puede enviar y recibir datos. Para enviar datos, debe llamar al método SendData. Cuando se reciben datos, se produce el evento DataArrival. Los datos se pueden obtener llamando al método GetData en el evento DataArrival.
1.2 Principios básicos de UDP
El Protocolo de datagramas de usuario (UDP) es un protocolo sin conexión. A diferencia del funcionamiento de TCP, la computadora no establece una conexión. Además, las aplicaciones UDP pueden ser clientes o servidores.
Para transferir datos, el ordenador cliente primero configura la propiedad LocalPort. 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. Luego, la computadora cliente usa el método GetData en el evento DataArrival para recuperar 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 son 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 que puede compararse a un sistema telefónico. Los usuarios deben establecer una conexión antes de que pueda comenzar la transferencia de datos.
El protocolo UDP es un protocolo sin conexión, y la transmisión entre dos ordenadores es similar al envío de correo: la información se envía 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 transferencia depende de la red específica.
La elección específica del protocolo suele depender de la aplicación que se desea crear. Las siguientes preguntas ayudarán a elegir el protocolo adecuado:
1. ¿La aplicación necesita obtener confirmación del cliente o servidor al enviar o recibir datos? Si es necesario, utilice el protocolo TCP para establecer una conexión clara antes de enviar o recibir datos.
2. ¿La cantidad de datos es particularmente grande (como imágenes y archivos de sonido)? Una vez que se establece una conexión, el protocolo TCP mantiene la conexión y garantiza la integridad de los datos. Sin embargo, este tipo de conexiones requieren más recursos informáticos y, por tanto, "cuestan" más.
3. ¿Los datos se envían de forma intermitente o en 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 para enviar pequeñas cantidades de datos.
La selección del protocolo de comunicación se logra configurando el atributo de protocolo de WinSock. Elija el siguiente protocolo 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 "Identidad".
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. Para el sistema operativo del lado del servidor Win95, ingrese "winipcfg" en el campo "Abrir"; para el sistema operativo del lado del servidor Winnt, ingrese "Abrir" en el campo "Abrir". Si el sistema operativo del servidor es winnt, complete "ipconfig" en el campo "Abrir".
4. Pulse Aceptar.
El nombre de la computadora o la dirección IP que se encuentran arriba se pueden usar como valor para la propiedad WinSock RemoteHost.
3) Propiedades de estado de los controles Winsock.
El atributo de estado se establece en los siguientes valores: Constante
Valor Descripción
sckclosed 0 Predeterminado. Cerrado
sckopen 1 Abierto
scklistening 2 Escuchando
sckconnectionpending 3 Conexión pendiente
sckresolvinghost 4 Host determinado
p>sckhostresolved 5 Determinado HostPrivate Sub cmdConnect_Click()
En caso de error Ir a ErrorPro
sckClient.Connect
Salir de Sub
ErrorPro:
MsgBox "¡El servidor no está abierto o error de red!"
ErrorPro:
Fin
End Sub
Sub privado cmdSent_Click()
sckClient.SendData txtSent.Text
End Sub
Private Sub Form_ Load()
' RemoteComputerName es el nombre de la computadora del servidor o la dirección IP.
sckClient.RemoteHost = "RemoteComputerName"
sckClient.RemotePort = 1000
End Sub
Sub privado sckClient_Close()
MsgBox "¡El canal del servidor ha sido cerrado!"
End Sub
Private Sub sckClient_Close()
Fin
Fin Sub
Sub privado sckClient_Connect()
MsgBox "¡Conexión exitosa!"
CMD_Connect()
cmdConnect.Enabled = False p >
End Sub
Sub privado sckClient_DataArrival(ByVal bytesTotal As Long)
Dim s As String
sckClient.GetData s
lstReceive.AddItem s
MsgBox "¡Conexión exitosa! AddItem s
End Sub
Private Sub sckClient_Error(ByVal Número como entero, Descripción como cadena, ByVal Scode siempre, _ ByVal Source como cadena, ByVal HelpFile como cadena, ByVal HelpContext 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. el formulario predeterminado "frmServer"
3. Agregue un control ListBox al formulario y asígnele el nombre "lstReceive"
4. Agregue tres controles WinSock, llamados "sckListen". , "sckBusy" y "sckServer" respectivamente, y configure "sckServer", establezca la propiedad "Índice" de "sckServer" en 0.
5. Añade el siguiente código al formulario.
'MaxChan como entero
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.
DoEvents
End Sub
Sub privado sckListen_ConnectionRequest(ByVal requestID As Long)
Atenuar i como entero
'Determina qué Winsock acepta la solicitud
For i = 0 To MaxChan - 1
Si sckServer(i).State = 0 Entonces
Salir de p>
p>
Finalizar si
Siguiente i
Si sckServer(i).Aceptar ID de solicitud
Fin de sub
Private Sub sckListen_Error (Número ByVal como entero, Descripción como cadena, Código ByVal tan largo, _ Fuente ByVal como cadena, Archivo de ayuda ByVal como cadena, Contexto de ayuda ByVal como largo, CancelDisplay como booleano)
sckListen.Close
sckListen.LocalPort = 1000