From e156354a60d0286c66f18dd1fc4ad9e7e5852075 Mon Sep 17 00:00:00 2001 From: Travis Watkins Date: Fri, 3 Aug 2012 00:06:25 -0500 Subject: [PATCH] Add DedicatedServerConnectionThread from mc-dev for diff visibility. --- .../DedicatedServerConnectionThread.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java diff --git a/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java b/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java new file mode 100644 index 0000000000..f27ce28f7a --- /dev/null +++ b/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java @@ -0,0 +1,119 @@ +package net.minecraft.server; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class DedicatedServerConnectionThread extends Thread { + + private static Logger a = Logger.getLogger("Minecraft"); + private final List b = Collections.synchronizedList(new ArrayList()); + private final HashMap c = new HashMap(); + private int d = 0; + private final ServerSocket e; + private ServerConnection f; + private final InetAddress g; + private final int h; + + public DedicatedServerConnectionThread(ServerConnection serverconnection, InetAddress inetaddress, int i) { + super("Listen thread"); + this.f = serverconnection; + this.g = inetaddress; + this.h = i; + this.e = new ServerSocket(i, 0, inetaddress); + this.e.setPerformancePreferences(0, 2, 1); + } + + public void a() { + List list = this.b; + + synchronized (this.b) { + for (int i = 0; i < this.b.size(); ++i) { + NetLoginHandler netloginhandler = (NetLoginHandler) this.b.get(i); + + try { + netloginhandler.c(); + } catch (Exception exception) { + netloginhandler.disconnect("Internal server error"); + a.log(Level.WARNING, "Failed to handle packet: " + exception, exception); + } + + if (netloginhandler.c) { + this.b.remove(i--); + } + + netloginhandler.networkManager.a(); + } + } + } + + public void run() { + while (this.f.b) { + try { + Socket socket = this.e.accept(); + InetAddress inetaddress = socket.getInetAddress(); + long i = System.currentTimeMillis(); + HashMap hashmap = this.c; + + synchronized (this.c) { + if (this.c.containsKey(inetaddress) && !b(inetaddress) && i - ((Long) this.c.get(inetaddress)).longValue() < 4000L) { + this.c.put(inetaddress, Long.valueOf(i)); + socket.close(); + continue; + } + + this.c.put(inetaddress, Long.valueOf(i)); + } + + NetLoginHandler netloginhandler = new NetLoginHandler(this.f.d(), socket, "Connection #" + this.d++); + + this.a(netloginhandler); + } catch (IOException ioexception) { + ioexception.printStackTrace(); + } + } + + System.out.println("Closing listening thread"); + } + + private void a(NetLoginHandler netloginhandler) { + if (netloginhandler == null) { + throw new IllegalArgumentException("Got null pendingconnection!"); + } else { + List list = this.b; + + synchronized (this.b) { + this.b.add(netloginhandler); + } + } + } + + private static boolean b(InetAddress inetaddress) { + return "127.0.0.1".equals(inetaddress.getHostAddress()); + } + + public void a(InetAddress inetaddress) { + if (inetaddress != null) { + HashMap hashmap = this.c; + + synchronized (this.c) { + this.c.remove(inetaddress); + } + } + } + + public void b() { + try { + this.e.close(); + } catch (Throwable throwable) { + ; + } + } +}