From d77587ca38257c37b1b2458fb43e096921aca43a Mon Sep 17 00:00:00 2001 From: Nicolas BARBOTIN Date: Mon, 5 Feb 2018 01:57:37 +0100 Subject: [PATCH] Beginning work on server block --- README.md | 1 + libs/mcef-1.12.2-0.9-api.jar | Bin 303731 -> 311591 bytes .../montoyo/wd/miniserv/OutgoingPacket.java | 102 +++++++++++++ .../net/montoyo/wd/miniserv/PacketID.java | 19 +++ .../net/montoyo/wd/miniserv/PacketReader.java | 59 ++++++++ .../net/montoyo/wd/miniserv/PacketWriter.java | 56 +++++++ .../montoyo/wd/miniserv/server/Server.java | 139 ++++++++++++++++++ .../wd/miniserv/server/ServerClient.java | 138 +++++++++++++++++ 8 files changed, 514 insertions(+) create mode 100644 src/main/java/net/montoyo/wd/miniserv/OutgoingPacket.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/PacketID.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/PacketReader.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/PacketWriter.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/server/Server.java create mode 100644 src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java diff --git a/README.md b/README.md index 5ceb249..fd9a53a 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ This is the unfinished port of the WebDisplays mod for Minecraft 1.12.2. The tex * minePad management: check GuiContainer.draggedStack for minePad * Change mod name to WD2 * Put a limit on screen resolution +* Auto-find rotation for BOTTOM & TOP screens ### Config elements * Site blacklist diff --git a/libs/mcef-1.12.2-0.9-api.jar b/libs/mcef-1.12.2-0.9-api.jar index 476f59cde1284761dcc6e1403696d4fb389eed07..60ffc723da71a545bd9654f7af68eeae8095b781 100644 GIT binary patch delta 43966 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 diff --git a/src/main/java/net/montoyo/wd/miniserv/OutgoingPacket.java b/src/main/java/net/montoyo/wd/miniserv/OutgoingPacket.java new file mode 100644 index 0000000..6d605c4 --- /dev/null +++ b/src/main/java/net/montoyo/wd/miniserv/OutgoingPacket.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.miniserv; + +import java.io.*; +import java.util.function.Consumer; + +public final class OutgoingPacket { + + private ByteArrayOutputStream baos; + private DataOutputStream dos; + private Consumer onFinish; + + public OutgoingPacket() { + baos = new ByteArrayOutputStream(); + dos = new DataOutputStream(baos); + } + + public final void writeInt(int i) { + try { + dos.writeInt(i); + } catch(IOException ex) {} + } + + public final void writeByte(int b) { + try { + dos.writeByte(b); + } catch(IOException ex) {} + } + + public final void writeShort(int s) { + try { + dos.writeShort(s); + } catch(IOException ex) {} + } + + public final void writeBoolean(boolean b) { + try { + dos.writeBoolean(b); + } catch(IOException ex) {} + } + + public final void writeBytes(byte[] data) { + try { + dos.write(data); + } catch(IOException ex) {} + } + + public final void writeBytes(byte[] data, int offset, int size) { + try { + dos.write(data, offset, size); + } catch(IOException ex) {} + } + + public final void writeString(String str) { + byte[] bytes; + try { + bytes = str.getBytes("UTF-8"); + } catch(UnsupportedEncodingException ex) { + return; //Meh, shouldn't happen + } + + try { + dos.writeShort(bytes.length); + dos.write(bytes); + } catch(IOException ex) {} + } + + public final int writeStream(InputStream is, int max) throws IOException { + final int origMax = max; + final byte[] buf = new byte[8192]; + + while(max > 0) { + int read = is.read(buf, 0, (max < buf.length) ? max : buf.length); + if(read <= 0) + return origMax - max; + + dos.write(buf, 0, read); + max -= read; + } + + return origMax; + } + + public final byte[] finish() { + if(onFinish != null) + onFinish.accept(this); + + byte[] bytes = baos.toByteArray(); + baos = null; + dos = null; + + return bytes; + } + + public final void setOnFinishAction(Consumer action) { + onFinish = action; + } + +} diff --git a/src/main/java/net/montoyo/wd/miniserv/PacketID.java b/src/main/java/net/montoyo/wd/miniserv/PacketID.java new file mode 100644 index 0000000..fa0e966 --- /dev/null +++ b/src/main/java/net/montoyo/wd/miniserv/PacketID.java @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.miniserv; + +public enum PacketID { + + PING, //C->S and S->C + BEGIN_FILE_UPLOAD, //C->S + FILE_PART, //C->S and S->C + GET_FILE; //C->S + + public static PacketID fromInt(int i) { + PacketID[] values = values(); + return (i < 0 || i >= values.length) ? null : values[i]; + } + +} diff --git a/src/main/java/net/montoyo/wd/miniserv/PacketReader.java b/src/main/java/net/montoyo/wd/miniserv/PacketReader.java new file mode 100644 index 0000000..d77b4d6 --- /dev/null +++ b/src/main/java/net/montoyo/wd/miniserv/PacketReader.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.miniserv; + +import net.montoyo.wd.utilities.Log; + +import java.nio.ByteBuffer; + +public final class PacketReader { + + private final byte[] sizeArray = new byte[4]; + private byte[] packetData; + private int pos = 0; + private boolean needSize = true; + + public final boolean readFrom(ByteBuffer buf) { + if(needSize) { + //Read packet size + if(readByteArray(sizeArray, buf)) { + int packetSize = (sizeArray[0] << 24) | (sizeArray[1] << 16) | (sizeArray[2] << 8) | sizeArray[3]; + needSize = false; + pos = 0; + + if(packetSize < 5 || packetSize > 65536) { + Log.warning("Got invalid packet from client of size %d, things won't go well...", packetSize); + return true; //Abort packet reading + } + + packetData = new byte[packetSize]; + } else + return false; + } + + return readByteArray(packetData, buf); + } + + private boolean readByteArray(byte[] dst, ByteBuffer src) { + int remaining = dst.length - pos; + int read = (src.remaining() >= remaining) ? remaining : src.remaining(); + + src.get(dst, pos, read); + pos += read; + + return (pos >= dst.length); + } + + public final byte[] getPacketData() { + return packetData; + } + + public final void reset() { + packetData = null; + pos = 0; + needSize = true; + } + +} diff --git a/src/main/java/net/montoyo/wd/miniserv/PacketWriter.java b/src/main/java/net/montoyo/wd/miniserv/PacketWriter.java new file mode 100644 index 0000000..40d31dc --- /dev/null +++ b/src/main/java/net/montoyo/wd/miniserv/PacketWriter.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.miniserv; + +import java.nio.ByteBuffer; + +public final class PacketWriter { + + private final byte[] sizeBytes = new byte[4]; + private byte[] packet; + private int pos = 0; + private boolean needToWriteSize = true; + + public final boolean writeTo(ByteBuffer bb) { + if(packet == null) + return true; //Next packet please + + if(needToWriteSize) { + if(writeByteArray(bb, sizeBytes)) { + needToWriteSize = false; + pos = 0; + } else + return false; + } + + if(writeByteArray(bb, packet)) { + packet = null; + return true; + } else + return false; + } + + private boolean writeByteArray(ByteBuffer dst, byte[] src) { + int remaining = src.length - pos; + int written = (dst.remaining() >= remaining) ? remaining : dst.remaining(); + dst.put(src, pos, written); + + pos += written; + return (pos >= src.length); + } + + public final void reset(byte[] pkt) { + final int len = pkt.length + 4; + sizeBytes[0] = (byte) ((len >> 24) & 0xFF); + sizeBytes[1] = (byte) ((len >> 16) & 0xFF); + sizeBytes[2] = (byte) ((len >> 8) & 0xFF); + sizeBytes[3] = (byte) ( len & 0xFF); + + packet = pkt; + pos = 0; + needToWriteSize = true; + } + +} diff --git a/src/main/java/net/montoyo/wd/miniserv/server/Server.java b/src/main/java/net/montoyo/wd/miniserv/server/Server.java new file mode 100644 index 0000000..fb747e5 --- /dev/null +++ b/src/main/java/net/montoyo/wd/miniserv/server/Server.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.miniserv.server; + +import net.montoyo.wd.utilities.Log; + +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.HashMap; + +public class Server extends Thread { + + private ServerSocketChannel server; + private Selector selector; + private int port = 25566; + private final ArrayList clientList = new ArrayList<>(); + private final HashMap clientMap = new HashMap<>(); + private final ByteBuffer readBuffer = ByteBuffer.allocateDirect(8192); + + public Server() { + setDaemon(true); + } + + @Override + public void start() { + try { + server = ServerSocketChannel.open(); + server.configureBlocking(false); + server.socket().bind(new InetSocketAddress(port)); + + selector = Selector.open(); + server.register(selector, SelectionKey.OP_ACCEPT); + } catch(Throwable t) { + t.printStackTrace(); + return; + } + + super.start(); + } + + @Override + public void run() { + boolean running = true; + + while(running) { + try { + loopUnsafe(); + } catch(Throwable t) { + t.printStackTrace(); + running = false; + } + } + } + + private void loopUnsafe() throws Throwable { + selector.select(); + + for(SelectionKey key: selector.selectedKeys()) { + if(key.isAcceptable()) { + SocketChannel chan; + + try { + chan = server.accept(); + } catch(Throwable t) { + Log.warningEx("Could not accept client", t); + chan = null; + } + + if(chan != null) { + chan.configureBlocking(false); + chan.register(selector, SelectionKey.OP_READ); + + ServerClient toAdd = new ServerClient(chan, selector); + clientMap.put(chan, toAdd); + clientList.add(toAdd); + } + } else if(key.isReadable()) { + ServerClient cli = clientMap.get(key.channel()); + + if(cli == null) + Log.warning("Received read info from unknown client"); + else { + try { + readBuffer.clear(); + int read = cli.getChannel().read(readBuffer); + + if(read < 0) + cli.setShouldRemove(); //End of stream + else { + readBuffer.position(0); + readBuffer.limit(read); + cli.readyRead(readBuffer); + } + } catch(Throwable t) { + Log.warningEx("Could not read data from client", t); + cli.setShouldRemove(); + } + } + } else if(key.isWritable()) { + ServerClient cli = clientMap.get(key.channel()); + + if(cli == null) + Log.warning("Received write info from unknown client"); + else { + try { + cli.readyWrite(); + } catch(Throwable t) { + Log.warningEx("Could not write data to client", t); + cli.setShouldRemove(); + } + } + } + } + + for(int i = clientList.size() - 1; i >= 0; i--) { + ServerClient cli = clientList.get(i); + + if(cli.shouldRemove()) + removeClient(cli); + } + } + + private void removeClient(ServerClient cli) { + clientMap.remove(cli.getChannel()); + clientList.remove(cli); + + try { + cli.getChannel().close(); + } catch(Throwable t) {} + } + +} diff --git a/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java b/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java new file mode 100644 index 0000000..f4ebc93 --- /dev/null +++ b/src/main/java/net/montoyo/wd/miniserv/server/ServerClient.java @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.miniserv.server; + +import net.montoyo.wd.miniserv.OutgoingPacket; +import net.montoyo.wd.miniserv.PacketID; +import net.montoyo.wd.miniserv.PacketReader; +import net.montoyo.wd.miniserv.PacketWriter; +import net.montoyo.wd.utilities.Log; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.SocketChannel; +import java.util.ArrayDeque; + +public class ServerClient { + + private final SocketChannel socket; + private final Selector selector; + private SelectionKey writeKey; + private boolean remove; + private final ByteBuffer sendBuffer = ByteBuffer.allocateDirect(8192); + private final ArrayDeque sendQueue = new ArrayDeque<>(); + private final PacketReader packetReader = new PacketReader(); + private final PacketWriter packetWriter = new PacketWriter(); + + ServerClient(SocketChannel s, Selector ss) { + socket = s; + selector = ss; + sendBuffer.limit(0); //Set empty + } + + void readyRead(ByteBuffer bb) { + while(bb.remaining() > 0) { + if(packetReader.readFrom(bb)) { //End of packet + byte[] pkt = packetReader.getPacketData(); + if(pkt != null) { + try { + handlePacket(pkt); + } catch(IOException ex) { + Log.warningEx("IOException while trying to handle packet", ex); + } + } + + packetReader.reset(); + } + } + } + + private void handlePacket(byte[] pkt) throws IOException { + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(pkt)); + PacketID pid = PacketID.fromInt(dis.readByte()); + + if(pid == null) { + Log.warning("Caught packet with invalid ID from client"); + return; + } + + OutgoingPacket response = null; + + switch(pid) { + case PING: + response = new OutgoingPacket(); + response.writeByte(PacketID.PING.ordinal()); + break; + + case BEGIN_FILE_UPLOAD: + break; + + case FILE_PART: + break; + + case GET_FILE: + break; + } + + if(response != null) + sendPacket(response); + } + + void readyWrite() throws Throwable { + if(sendBuffer.remaining() > 0 || fillSendBuffer()) { + if(socket.write(sendBuffer) < 0) + remove = true; + } else if(writeKey != null) { + writeKey.cancel(); + writeKey = null; + } + } + + void setShouldRemove() { + remove = true; + } + + public boolean shouldRemove() { + return remove; + } + + SocketChannel getChannel() { + return socket; + } + + private boolean fillSendBuffer() { + sendBuffer.clear(); + + do { + if(packetWriter.writeTo(sendBuffer)) { + OutgoingPacket pkt = sendQueue.poll(); + if(pkt == null) + return sendBuffer.remaining() > 0; + + packetWriter.reset(pkt.finish()); + } + } while(sendBuffer.remaining() > 0); + + return true; + } + + public void sendPacket(OutgoingPacket pkt) { + sendQueue.offer(pkt); + + if(writeKey == null) { + try { + writeKey = socket.register(selector, SelectionKey.OP_WRITE); + } catch(ClosedChannelException ex) { + Log.warningEx("Couldn't send packet", ex); + } + } + } + +}