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();
}
}