HOME PCB
..ReceivingDatagramThread.javaSendingDatagramThread.javaUDPMessageService.javaUDPSession.java
package Communication.Messages.UDP;

import Communication.Messages.Service.MessageFactory;
import Communication.Messages.Service.MessageSession;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UDPSession extends MessageSession
{
    private final DatagramSocket sock;

    public UDPSession(DatagramSocket sock)
    {
        this.sock = sock;
    }

    @Override
    public DataInputStream getReceiveStream() throws IOException
    {
        int maxSize = MessageFactory.getInstance().getMaxNameLength() + MessageFactory.getInstance().getMaxSize();
        DatagramPacket datagramPacket = new DatagramPacket(new byte[maxSize], maxSize);
        this.sock.receive(datagramPacket);
        return new DataInputStream(new ByteArrayInputStream(datagramPacket.getData()));
    }

    @Override
    protected void sendImpl(Object o, Object messageHandler, Method send) throws IOException, InvocationTargetException, IllegalAccessException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(byteArrayOutputStream);
        send.invoke(messageHandler, dos, this);
        dos.flush();
        byte[] bytes = byteArrayOutputStream.toByteArray();
        this.sock.send(new DatagramPacket(bytes, bytes.length));
    }

    @Override
    public InetSocketAddress getSocketAddress() {
        return (InetSocketAddress) this.sock.getRemoteSocketAddress();
    }

    @Override
    public boolean isClosed()
    {
        return this.sock.isClosed();
    }
}