diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/Overgram.java b/lib/src/main/java/io/github/lonamiwebs/overgram/Overgram.java index 3f3c167..9182f4b 100644 --- a/lib/src/main/java/io/github/lonamiwebs/overgram/Overgram.java +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/Overgram.java @@ -1,6 +1,14 @@ package io.github.lonamiwebs.overgram; +import io.github.lonamiwebs.overgram.network.connection.Connection; +import io.github.lonamiwebs.overgram.network.connection.TcpFull; + +import java.io.IOException; + public class Overgram { - public static void main(final String... args) { + public static void main(final String... args) throws IOException { + final Connection connection = new TcpFull(); + connection.connect("149.154.167.91", 443); + connection.disconnect(); } } diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/network/TcpClient.java b/lib/src/main/java/io/github/lonamiwebs/overgram/network/TcpClient.java new file mode 100644 index 0000000..62c5fdc --- /dev/null +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/network/TcpClient.java @@ -0,0 +1,46 @@ +package io.github.lonamiwebs.overgram.network; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; + +public class TcpClient { + + private Socket socket; + + public void connect(final String ipAddress, final int port) throws IOException { + socket = new Socket(ipAddress, port); + } + + public void close() { + try { + socket.close(); + } catch (IOException ignored) { + } + } + + public byte[] read(final int length) throws IOException { + final InputStream in = socket.getInputStream(); + final byte[] result = new byte[length]; + + int index = 0; + while (true) { + final int count = in.read(result, index, result.length - index); + if (count == -1) { + throw new IOException("Connection closed"); + } + + index += count; + if (index == result.length) { + return result; + } + } + } + + public void write(final byte[] bytes) throws IOException { + final OutputStream out = socket.getOutputStream(); + out.write(bytes); + out.flush(); + } +} diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/network/connection/Connection.java b/lib/src/main/java/io/github/lonamiwebs/overgram/network/connection/Connection.java new file mode 100644 index 0000000..ea66817 --- /dev/null +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/network/connection/Connection.java @@ -0,0 +1,13 @@ +package io.github.lonamiwebs.overgram.network.connection; + +import java.io.IOException; + +public abstract class Connection { + public abstract void connect(final String ipAddress, final int port) throws IOException; + + public abstract void disconnect(); + + public abstract void send(final byte[] data) throws IOException; + + public abstract byte[] recv() throws IOException; +} diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/network/connection/TcpFull.java b/lib/src/main/java/io/github/lonamiwebs/overgram/network/connection/TcpFull.java new file mode 100644 index 0000000..7b52752 --- /dev/null +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/network/connection/TcpFull.java @@ -0,0 +1,59 @@ +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); + buffer.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)); + 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)).getInt(); + // TODO Check crc + return body; + } +}