Search code examples
javasocketstcp

How to send bytearray to specific receiver


I have a TCP Server and Client in Java. The Server can send commands to the Client, the Client will then execute the command, for example: send an image to the Server.

Im sending the data with a bytearray and thats working.

But lets imagine, I want to send an image and a file separately. How would the Server supposed to know which is the right bytearray? Or if I want to make a VoiceChat (which needs to be sending bytearrays continously) and separately sending an image?

Thats my code send bytes:

Client.java

    public void writeBytes(byte[] bytes, Socket socket) throws IOException {
        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        out.write(bytes);
        out.flush();
    }

Thats my code to receive and convert them to an Image:

Server.java

    public BufferedImage writeScreenshot(Socket socket, int length) throws IOException {
        DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
        byte[] buffer = new byte[length];
        in.readFully(buffer);

        return ImageIO.read(new ByteArrayInputStream(buffer));
    }

Solution

  • You need to design a "protocol" for the communication. A protocol defines what are the messages that can be exchanged and how they are represented in the lower level data stream.

    A quick and easy protocol is where you first send the length of the data you are going to send, and then the data:

        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        out.writeInt(bytes.length);
        out.write(bytes);
        out.flush();
    

    The receiver now has to read the length field:

        DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
        int length = in.readInt()
        byte[] buffer = new byte[length];
        in.readFully(buffer);
    

    When you get to applications like voice chat, the protocol has to get more complex. Each message has to have metadata, like what type of data it contains: image or voice or something else. Also you would likely not want to design this protocol from scratch, but use something that already exists - for example the real-time streaming protocol (RTSP).