Estoy trabajando en una aplicación que lee y escribe datos binarios y a una toma de corriente. Así que primero tengo que crear un socket con TcpClient. Pero estoy atascado en la lectura de los datos de la toma. Hay ejemplos de código sobre cómo leer los datos binarios de la toma de corriente?

Concreto, hay 2 cosas que no entiendo. En primer lugar, ¿cómo puedo saber si un mensaje es «recibido»? Qué necesito para crear algún tipo de bucle para esto? Y la segunda: ¿cuál es la mejor manera de leer estos datos, ya que los datos que recibo es binario y no un simple cadena.

Gracias

InformationsquelleAutor Martijn | 2010-09-13

4 Comentarios

  1. 5

    La TCPClient documentación de Microsoft es realmente muy útil.

    ¿Cómo leer los datos de la TCPClient

    La parte clave en Microsoft ejemplo para la lectura de los datos desde el zócalo es este:

    //Get the stream
    NetworkStream stream = client.GetStream();
    Byte[] data = new Byte[256];
    
    //String to store the response ASCII representation.
    String responseData = String.Empty;
    
    //Read the first batch of the TcpServer response bytes.
    int bytes = stream.Read(data, 0, data.Length);
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);

    Que el uso de la GetStream método de la TCPClient clase y leer todos los datos disponibles (hasta 256 bytes) a partir de la corriente.

    Esto es un poco de trampa, aunque, como se acaba de recibir una gran cantidad de datos y suponiendo que se trata de una completa y correcta del mensaje. Funcionará bien siempre y cuando su cliente es 100% predecible en que se envía siempre la misma cosa, a continuación, desconecta.

    Mejor manera de manejar esta abajo…

    ¿Cómo saber si un mensaje es recibido?

    Usted no, usted acaba de mantener la recepción de datos hasta que no hay más que ver lo que ha recibido (o de verificación as you go).

    Para hacer esto, usted tiene que diseñar el mensaje para incluir alguna manera de decirle a la longitud (número entero en el inicio de indicación de longitud), o algunas de fin de mensaje marcador (por ejemplo, retorno de carro) o tener una longitud fija mensaje.

    Por ejemplo, la especificación de mensaje podría ser como esta:

    De DATOS
    hola amigo

    FINAL

    Buscando la FINAL, seguido por un retorno de carro, usted sabrá que usted ha encontrado el final del mensaje. Asimismo, el DATA marcador al principio le ayuda a saber dónde un mensaje en el que se inicia y dividir el mensaje de datos.

    ¿Cuál es la mejor manera de leer estos datos?

    Todos los datos enviados/recibidos serán en binario, a la necesidad de Codificar y Decodificar los datos. En el ejemplo, se trata de convertir los datos binarios a la cadena (y al revés), utilizando el construido en la Codificación ASCII clase GetString y GetBytes métodos.

    Considerar la implementación de un protocolo de conocidos

    Yo recomendaría a (donde sea posible) el uso de un protocolo establecido, en lugar de simplemente enviar texto plano a través de TCP. Hay normas para casi cualquier cosa y cualquier persona que se conecta a su aplicación va a encontrar que es más fácil seguir un conocido y definido estándar.

    También hay muchos pre-construido bibliotecas para que comúnmente se utiliza protocolos de ahorro de usted y sus clientes el buscabamos.

  2. 0

    Todos los datos enviados a través de un socket es binario. Es hasta usted para interpretarlo como algo más, por ejemplo una cadena. Puede utilizar funciones como estos para enviar o recibir datos. Usted puede llamar a ellos con un NetworkStream que se obtiene de su NetworkStream stream = client.GetStream();. Tenga en cuenta que estas funciones enviar un int con el tamaño de los datos en primer lugar.

    public void send(NetworkStream stream, byte[] buf) {
        stream.Write(BitConverter.GetBytes(buf.Length), 0, 4);
        stream.Write(buf, 0, buf.Length);
    }
    
    public byte[] receive(NetworkStream stream) {
        byte[] lengthBytes = new byte[4];
        int read = stream.Read(lengthBytes, 0, 4);
        //read contains the number of read bytes, so we can check it if we want
        int length = BitConverter.GetInt32(lengthBytes);
        byte[] buf = new byte[length];
        stream.Read(buf, 0, buf.length);
        return buf;
    }
    • OP es el uso de TcpClient, no hacerlo directamente.
    • Uy, me acabo de dar cuenta. He basado mi respuesta en el título y la etiqueta..
    • La lectura de secuencias tcp es mucho más complicado, ya que la corriente.Leer() no siempre puede leer el número esperado de bytes.
  3. 0

    El primer paso es llamar a GetStream en el TcpClient instancia, que le da una referencia a la NetworkStream con la que podrás enviar y recibir datos binarios. Usted puede envolver que en un BinaryReader y BinaryWriter para enviar y recibir .NET primitivas (como Int32s, Cadenas, etc) o el uso de la NetworkStream métodos directamente de las matrices de bytes. Usted encontrará los NetworkStream.Leer, NetworkStream.BeginRead y NetworkStream.DataAvailable miembros útil; ver http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream_members.aspx para obtener más información.

Dejar respuesta

Please enter your comment!
Please enter your name here