Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo transferir voz y archivos con VB, quiero crear una herramienta de chat

Cómo transferir voz y archivos con VB, quiero crear una herramienta de chat

La transmisión de voz y archivos se puede lograr a través de Mswinsock, pero no lo he probado en términos de velocidad. Recientemente hice algunas cosas relacionadas con Mswinsock. Te enviaré el código. será útil

La transmisión de archivos es una función básica para la programación de redes, como el software de control remoto. Al compilar un software, descargué muchos programas de transferencia de archivos de Internet, pero las funciones de transferencia de archivos proporcionadas por estos programas no se podían utilizar en absoluto. Está bien transferir texto, pero no es posible transferir archivos binarios en absoluto. Por tanto, como módulo funcional básico, es necesario introducirlo por separado.

Primero, para transferir una cadena en VB, puedes escribir así:

Dim strData As String

strData = "Test"

Winsock1.SendData strData

Pero si envías un archivo binario, ¿aún puedes usar una variable String para almacenarlo? El análisis teórico no es posible. También he hecho experimentos y de hecho no es posible. Aunque los archivos se pueden transferir, los archivos recibidos son diferentes de los enviados. La razón puede ser que los archivos binarios pueden tener cualquier "caracter", pero no todos los caracteres se pueden colocar en variables de cadena.

A excepción de las variables de tipo String, otros tipos de variables en VB tienen solo unos pocos bytes de longitud. ¿Solo se pueden enviar unos pocos bytes a la vez? ¿No agotaría eso la máquina? De hecho, la situación no es tan pesimista. Podemos usar matrices completamente para resolver este problema, es decir, usar matrices de bytes. Lea todos los archivos que se transmitirán a la matriz y luego envíelos. El programa es el siguiente:

FileName es el nombre del archivo a transferir y WinS es el control WinSock utilizado para enviar el archivo. Este es un programa de remitente.

Sub SendFile público (nombre de archivo como cadena, WinS como Winsock)

Dim FreeF como entero ''Número de archivo libre

Dim LenFile As Long ''Longitud del archivo

Atenuar bytData() como byte ''Matriz para almacenar datos

FreeF = FreeFile ''Obtener número de archivo gratuito

Abrir nombre de archivo para binario como #FreeFile ' 'Abrir archivo

DoEvents

LenFile = LOF(FreeFile) ''Obtener la longitud del archivo

ReDim bytData(1 To LenFile) ''Según el archivo La longitud redefine el tamaño de la matriz

Obtener #FreeFile, , bytData ''Leer el archivo en la matriz

Cerrar #FreeFile ''Cerrar el archivo

WinS SendData bytData ''Enviar datos

End Sub

El programa en el extremo receptor es el siguiente:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)<. /p>

Dim bytData() como byte

Dim f

f = FreeFile

Abrir strFileName para binario como #f

ReDim bytData(1 To bytesTotal)

Winsock1.GetData bytData

Ponga #f, i, bytData

i = i bytesTotal '' Asegúrese de que cada la escritura está en el archivo. Al final, i es una variable global

Cerrar #f

End Sub

Hay dos cosas a las que prestar atención aquí: ReDim Preserve bytData (1 a LenFile), el subíndice comienza desde 1. Si escribe ReDim bytData (LenFile), el subíndice comienza desde 0 y la matriz es tan larga como LenFile 1. El LOF en LenFile = LOF(FreeFile) es una función para obtener la longitud del archivo. Está incluida en VB. He visto muchos ejemplos usando API o leyendo en un bucle hasta el final para obtener la longitud del archivo. Utilice la función LOF. Eso es todo.

Un programa de este tipo puede transmitir tanto archivos de texto como archivos binarios. ¿Pero has encontrado algún problema con este programa? ¿Qué pasa si quiero transferir un archivo de 50M? ¿Puede el sistema asignar 50 M de espacio de memoria para bytData?

Entonces el autor tomó un archivo de 50M como experimento. El archivo recibido era diferente del archivo original y era más grande que el original. ¿Cuál es el problema?

En primer lugar, redefinir el tamaño de la matriz bytData en función del tamaño del archivo tiene sus propios problemas. Es imposible que el sistema asigne espacio a la matriz sin límite. Incluso si puede, lo hará. hacer que el sistema responda lentamente. Al transferir un archivo de 50 M, el sistema pareció congelarse. Entonces, ¿cómo solucionar este problema? Una idea natural es transmitir los datos en segmentos. El programa es el siguiente:

Programa de envío, iPos es una variable global con un valor inicial de 0. Esta variable contiene la ubicación de los datos actuales.

Const iMax = 65535 es el tamaño de cada bloque de datos.

Dim FreeF As Integer ''Número de archivo libre

Dim LenFile As Long ''La longitud del archivo

Dim bytData() As Byte ''Almacenamiento matriz de datos de

FreeF = FreeFile ''Obtener número de archivo gratuito

Abrir nombre de archivo para binario como #FreeF ''Abrir archivo

DoEvents

LenFile = LOF(FreeF) ''Obtener la longitud del archivo

Si LenFile lt;= iMax Entonces ''Si el archivo a enviar es más pequeño que el tamaño del bloque de datos, envíelo directamente

ReDim bytData (1 To LenFile) ''Redefinir el tamaño de la matriz según la longitud del archivo

Get #FreeF, , bytData ''Leer el archivo en la matriz

Cerrar #FreeF ''Cerrar el archivo

WinS.SendData bytData ''Enviar datos

Salir de Sub

Finalizar si

'' El archivo es más grande que el tamaño del bloque de datos, divida el envío del bloque

Hacer hasta (iPos gt; = (LenFile - iMax)) ''Bucle para enviar el bloque completo de datos

ReDim bytData(1 To iMax)

Obtener #FreeF, iPos 1, bytData

WinS.SendData bytData

iPos = iPos iMax ''Mueve iPos para que apunta a los datos que se van a leer

Bucle

''Lo que se debe tener en cuenta aquí es que debe verificar si quedan datos en el archivo si el tamaño del archivo es. exactamente igual a un múltiplo entero del tamaño del bloque de datos

'', entonces No quedan datos

ReDim bytData(1 To LenFile - iPos) ''Enviar menos de un dato bloquear a la izquierda

Obtener #FreeF, iPos 1, bytData

WinS.SendData bytData

Cerrar #FreeF

El siguiente es el programa en el extremo receptor:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Atenuar bytData() As Byte

Atenuar lLenFile As Long

Dim f

f = FreeFile

Abrir strFileName para binario como #f ''strFileName es el nombre del archivo

lLenFile = LOF(f)

ReDim bytData(1 To bytesTotal)

Winsock1.GetData bytData

Si lLenFile = 0 Entonces ''lLenFile=0 significa que es la primera vez que se abre el archivo Hay un problema aquí, que es "Si el archivo existe, se producirá un error. Debe verificar que el archivo exista".

(Lo omití aquí)

Pon #f, 1, bytData

De lo contrario

Pon #f, lLenFile 1, bytData

Finalizar si

Cerrar #f

Fin Sub