cómo enviar un array de bytes a través de una conexión TCP (programación java)

Puede alguien demostrar cómo enviar un array de bytes a través de una conexión TCP desde un remitente programa a un receptor programa en Java.

byte[] myByteArray

(Soy nuevo en programación Java, y parece que no puede encontrar un ejemplo de cómo hacer esto que muestra ambos extremos de la conexión (remitente y el receptor.) Si usted sabe de un ejemplo, tal vez usted puede publicar el enlace. (No hay necesidad de reinventar la rueda). P. S. Esta es NO tarea! 🙂

InformationsquelleAutor Mark Roberts | 2010-05-21

9 Kommentare

  1. 56

    La InputStream y OutputStream clases en Java de forma nativa manejar matrices de bytes. La una cosa que usted desea, puede añadir es la longitud en el inicio del mensaje para que el receptor sabe cuántos bytes a esperar. Yo normalmente como ofrecer un método que permite controlar que los bytes de la matriz de bytes a enviar, como la norma API.

    Algo como esto:

    private Socket socket;
    
    public void sendBytes(byte[] myByteArray) throws IOException {
        sendBytes(myByteArray, 0, myByteArray.length);
    }
    
    public void sendBytes(byte[] myByteArray, int start, int len) throws IOException {
        if (len < 0)
            throw new IllegalArgumentException("Negative length not allowed");
        if (start < 0 || start >= myByteArray.length)
            throw new IndexOutOfBoundsException("Out of bounds: " + start);
        //Other checks if needed.
    
        //May be better to save the streams in the support class;
        //just like the socket variable.
        OutputStream out = socket.getOutputStream(); 
        DataOutputStream dos = new DataOutputStream(out);
    
        dos.writeInt(len);
        if (len > 0) {
            dos.write(myByteArray, start, len);
        }
    }

    EDITAR: Para agregar el lado de recepción:

    public byte[] readBytes() throws IOException {
        //Again, probably better to store these objects references in the support class
        InputStream in = socket.getInputStream();
        DataInputStream dis = new DataInputStream(in);
    
        int len = dis.readInt();
        byte[] data = new byte[len];
        if (len > 0) {
            dis.readFully(data);
        }
        return data;
    }
    • ¿cómo puedo bucle de esto? como cuando se espera un flujo de entrada
    • Bucle? Acabo de llamar a los métodos de un bucle. Si te refieres a la espera de un mensaje sin detener su programa, usted puede hacer el I/O en un subproceso independiente o modificar este uso de NIO.
    • No lo he probado, pero Si len > [TCP tamaño de paquete], creo que readFully() no puede leer todo el contenido, pero sólo la primera de las piezas…. (docs.oracle.com/javase/7/docs/api/java/io/…) por Lo que este código no funcione como es en este caso, la derecha?
    • creo que readFully se encarga de eso. lee tantos paquetes como sea necesario hasta que len bytes se leen. si EF sucede antes de eso, se produce una excepción
    • «El InputStream y OutputStream clases en Java de forma nativa manejar matrices de bytes.» –Que es lo que hace Java hacemos aquí? Hace es convertir la matriz en una cadena en algún momento antes de interactuar con el stream? ¿Sabe usted el formato que se utiliza?
  2. 4

    Acaba de empezar con este ejemplo de la Realmente Un Gran Índice De. Aviso que si, que está diseñado para transmitir y recibir caracteres, no en bytes. Este no es un gran negocio, aunque – usted puede tratar sólo con el raw InputStream y OutputStream objetos que la Socket clase proporciona. Ver la API para obtener más información acerca de los diferentes tipos de lectores, escritores y arroyos. Los métodos que usted estará interesado en son OutputStream.write(byte[]) y InputStream.read(byte[]).

  3. 2

    El Oráculo De Socket Comunicaciones Tutorial parece ser el adecuado punto de lanzamiento.

    Nota que va a la molestia de para convertir los caracteres a bytes. Si quieres trabajar en el nivel de byte, sólo la cáscara que fuera.

    • gracias, pero no muestra cómo enviar una matriz de bytes
    • No puede usted imaginar el resto por ti mismo?
  4. 1

    Lo que necesitas es usar el write método de un java.io.OutputStream, y el read método de un java.io.InputStream, ambos de los cuales se puede recuperar de la Socket abrir.

  5. 1

    Me gustaría pedirle que use ObjectOutputStream y ObjectInputStream. Estas enviar todo como un objeto y a recibir la misma.

    ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
    os.flush();
    ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
    os.writeObject(byte_array_that_you_want_to_send);
    byte[] temp = (byte[]) is.readObject();

    También recordar en primer lugar crear el flujo de salida, un chorro de agua y, a continuación, seguir adelante con la secuencia de entrada, porque si algo queda en el flujo de la secuencia de entrada no será creado.

  6. 0

    Supongo que la pregunta es formulada incorrectamente. He encontrado esta cuando la búsqueda de una respuesta a por qué mi uso de InputStream y OutputStream parecía ser la configuración de toda la matriz a 0 en caso de encontrarse con un byte de valor 0. Hacer estos asumen que los bytes que contienen válido ASCII y binarios no. Ya que la pregunta no venir a la derecha y preguntar esto, y nadie parece haber tomado como una posibilidad, creo que voy a tener para satisfacer mi búsqueda en otros lugares.

    Lo que yo estaba tratando de hacer era escribir un TransparentSocket clase que puede crear instancias de un TCP (Socket/ServerSocket) o UDP (DatagramSocket) para utilizar el DatagramPacket de forma transparente. Funciona de la UDP, pero no (aún) para TCP.

    De seguimiento: me parece que han comprobado que estos flujos son en sí mismos inútiles para los binarios de las transferencias, pero que se pueden pasar a un programador más amigable que la creación de instancias, por ejemplo,

    new DataOutputStream(socket.getOutputStream()).writeInt(5);

    ^ Mucho esa idea. Escribe los datos en un «portátil» camino, es decir, probablemente ASCII, que no ayuda en absoluto, especialmente cuando emulación de software sobre las que no tengo control!

  7. 0
    import java.io.*;
    import java.net.*;
    
    public class ByteSocketClient 
    {
        public static void main(String[] args) throws UnknownHostException, IOException 
        {
            Socket s=new Socket("",6000);
    
            DataOutputStream dout=new DataOutputStream(new BufferedOutputStream(s.getOutputStream()));
    
            byte[] a = {(byte)0xC0,(byte)0xA8,(byte)0x01,(byte)0x02,(byte)0x53,(byte)0x4D,(byte)0x41,(byte)0x52,(byte)0x54};
            dout.write(a);
            dout.close();
            s.close();
        }
    
    }
    • ¿Por qué debe el OP «prueba esto»? Un buena respuesta siempre tiene una explicación de lo que se hace y por qué se hizo de esa manera, no sólo para el OP, pero para los futuros visitantes a fin de que pueda encontrar a esta pregunta y leer su respuesta.
  8. 0

    Aquí es un ejemplo de que los flujos de 100 bytes de archivo wav tramas a la vez.

    private Socket socket;
    
    public void streamWav(byte[] myByteArray, int start, int len) throws IOException {
    
        Path path = Paths.get("path/to/file.wav");
    
        byte[] data = Files.readAllBytes(path);
    
        OutputStream out = socket.getOutputStream();
        DataOutputStream os = new DataOutputStream(out);
    
        os.writeInt(len);
        if (len > 0) {
            os.write(data, start, len);
        }
    }
    
    public void readWav() throws IOException {
    
        InputStream in = socket.getInputStream();
    
        int frameLength = 100; //use useful number of bytes
    
        int input;
        boolean active = true;
    
        while(active) {
            byte[] frame = new byte[frameLength];
            for(int i=0; i<frameLength; i++) {
    
                input = in.read();
    
                if(input < 0) {
                    active = false;
                    break;
                } else frame[i] = (byte) input;
            }
    
            //playWavPiece(frame);
            //streamed frame byte array is full
            //use it here ;-)
        }
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea