Overgram/lib/src/main/java/io/github/lonamiwebs/overgram/network/connection/TcpFull.java

67 lines
1.8 KiB
Java

package io.github.lonamiwebs.overgram.network.connection;
import io.github.lonamiwebs.overgram.network.TcpClient;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.zip.CRC32;
public class TcpFull extends Connection {
private final TcpClient client;
private int counter;
public TcpFull() {
client = new TcpClient();
}
@Override
public void connect(final String ipAddress, final int port) throws IOException {
client.connect(ipAddress, port);
counter = 0;
}
@Override
public void disconnect() {
client.close();
}
@Override
public void send(final byte[] data) throws IOException {
final int length = data.length + 12;
final ByteBuffer buffer = ByteBuffer.allocate(length).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(length);
buffer.putInt(counter);
buffer.put(data);
final CRC32 crc32 = new CRC32();
crc32.update(buffer.array(), 0, length - 4);
buffer.putInt((int) crc32.getValue());
client.write(buffer.array());
++counter;
}
@Override
public byte[] recv() throws IOException {
final ByteBuffer buffer = ByteBuffer.wrap(client.read(8)).order(ByteOrder.LITTLE_ENDIAN);
final int length = buffer.getInt();
final int seq = buffer.getInt();
final byte[] body = client.read(length - 12);
final int crc = ByteBuffer.wrap(client.read(4)).order(ByteOrder.LITTLE_ENDIAN).getInt();
final CRC32 validCrc = new CRC32();
buffer.rewind();
validCrc.update(buffer.array());
validCrc.update(body);
if ((int) validCrc.getValue() != crc) {
throw new SecurityException("Invalid CRC");
}
return body;
}
}