¿cómo saber cuándo debe combinar las matrices de bytes recibidas en ambas llamadas?
Debe decidir esto en el nivel de protocolo. Hay cuatro modelos comunes:
- Cerrar-en-terminar: cada lado solo puede enviar un solo "mensaje" por conexión. Después de enviar el mensaje, cierran el lado de envío del socket. El lado receptor continúa leyendo hasta que llega al final de la transmisión.
- Prefijo de longitud: antes de cada mensaje, incluya el número de bytes en el mensaje. Esto podría ser en un formato de longitud fija (por ejemplo, siempre de 4 bytes) o en algún formato comprimido (por ejemplo, 7 bits de datos de tamaño por byte, bit superior configurado para el byte final de datos de tamaño). Luego está el mensaje en sí. El código de recepción leerá el tamaño, luego leerá muchos bytes.
- Chunking: como el prefijo de longitud, pero en trozos más pequeños. Cada fragmento tiene un prefijo de longitud, con un fragmento final que indica "fin del mensaje"
- Señal de fin de mensaje: siga leyendo hasta que vea el terminador del mensaje. Esto puede ser molesto si el mensaje debe poder incluir datos arbitrarios, ya que deberá incluir un mecanismo de escape para representar los datos del terminador dentro del mensaje.
Además, con menor frecuencia, existen protocolos que cada mensaje es siempre un tamaño determinado - en cuyo caso sólo tiene que seguir adelante hasta que haya leído que muchos datos.
En todos estos casos, básicamente es necesario realizar un bucle, leer datos en una especie de búfer hasta que tenga suficiente, sin importar cómo lo determine. Debería siempre usar el valor de retorno de Read
para notar cuántos bytes leyó realmente, y siempre comprobar si es 0, en cuyo caso ha llegado al final de la secuencia.
También tenga en cuenta que esto no solo afecta a las transmisiones de red: para cualquier cosa que no sea una MemoryStream
local (que siempre leerá la cantidad de datos que pida de una vez, si está en la transmisión), debería supongamos que los datos solo estarán disponibles en el transcurso de múltiples llamadas.
o haga su propio protocolo: D – EaterOfCode
O podría tener un protocolo de longitud fija donde conozca la longitud de los mensajes por adelantado. Sin embargo, no puedo pensar en un ejemplo útil de la parte superior de mi cabeza :( – NPSF3000
@EaterOfCorpses: estas son opciones * dentro de * un protocolo. Cómo detectar el final de un mensaje es solo una parte del protocolo. –