67 lines
1.8 KiB
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;
|
|
}
|
|
}
|