Create a basic Connection class
This commit is contained in:
parent
957e29b4db
commit
3960febf3c
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue