Archived
0

Bridge: посылаем пинг-пакеты

This commit is contained in:
2017-05-01 12:28:35 +03:00
parent 835900260d
commit 49ae0220fe
3 changed files with 42 additions and 9 deletions

View File

@@ -5,16 +5,22 @@
package asys.bridge.bukkit;
import asys.bridge.client.Client;
import asys.mcsmanager.packets.CS_Ping;
import io.netty.channel.Channel;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.concurrent.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class BridgePlugin extends JavaPlugin {
public static BridgePlugin INSTANCE;
private Client client;
private ScheduledFuture<?> sesFuture;
private ScheduledExecutorService ses;
private ScheduledFuture<?> sesFuture, sesPingFuture;
private int tryConnect = 0;
@Override
@@ -23,12 +29,11 @@ public class BridgePlugin extends JavaPlugin {
saveDefaultConfig();
client = new Client();
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
ses = Executors.newScheduledThreadPool(2);
sesFuture = ses.scheduleAtFixedRate(() -> {
getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect));
client.connect(getConfig().getString("host"), getConfig().getInt("port"));
if (client.isConnected()) {
getLogger().info(String.format("Connect(%d) OK", tryConnect));
sesFuture.cancel(false);
sesFuture = null;
} else {
@@ -44,6 +49,8 @@ public class BridgePlugin extends JavaPlugin {
sesFuture.cancel(false);
}
stopPing();
if (client.isConnected()) {
getLogger().info("Disconnect...");
client.disconnect();
@@ -57,4 +64,18 @@ public class BridgePlugin extends JavaPlugin {
sender.sendMessage("ASys Bridge by DmitriyMX");
return true;
}
public void startPing(Channel channel) {
sesPingFuture = ses.scheduleAtFixedRate(() -> channel.writeAndFlush(new CS_Ping(
System.currentTimeMillis(),
20.0D, //FIXME
BridgePlugin.INSTANCE.getServer().getOnlinePlayers().size()
)), 0L, 5L, TimeUnit.SECONDS);
}
public void stopPing() {
if (sesPingFuture != null) {
sesPingFuture.cancel(false);
}
}
}

View File

@@ -5,10 +5,7 @@
package asys.bridge.client;
import asys.bridge.bukkit.BridgePlugin;
import asys.mcsmanager.packets.CS_Handshake;
import asys.mcsmanager.packets.IPacketHandler;
import asys.mcsmanager.packets.Packet;
import asys.mcsmanager.packets.SC_HandshakeResult;
import asys.mcsmanager.packets.*;
import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableMap;
@@ -27,6 +24,10 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
);
private static Map<Class<? extends Packet>, IPacketHandler> handshakeHandlers;
private static final BiMap<Integer, Class<? extends Packet>> pingPackets = ImmutableBiMap.of(
3, CS_Ping.class
);
ClientPacketHandler() {
if (handshakeHandlers == null) {
handshakeHandlers = ImmutableMap.of(
@@ -37,29 +38,40 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
@Override
public void channelActive(ChannelHandlerContext context) throws Exception {
BridgePlugin.INSTANCE.getLogger().info("channelActive");
context.channel().attr(KNOWN_PACKETS).set(handshakePackets);
context.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers);
CS_Handshake packet = new CS_Handshake(
BridgePlugin.INSTANCE.getConfig().getString("clientId"),
BridgePlugin.INSTANCE.getConfig().getString("passcode"));
BridgePlugin.INSTANCE.getLogger().info("send Handshake packet...");
context.channel().writeAndFlush(packet);
super.channelActive(context);
}
@Override
public void channelInactive(ChannelHandlerContext context) throws Exception {
if (BridgePlugin.INSTANCE != null) {
BridgePlugin.INSTANCE.getLogger().info("channelInactive");
BridgePlugin.INSTANCE.stopPing();
}
context.channel().attr(KNOWN_PACKETS).remove();
context.channel().attr(KNOWN_HANDLERS).remove();
super.channelInactive(context);
}
@Override
public void handle(Packet packet, ChannelHandlerContext context) {
BridgePlugin.INSTANCE.getLogger().info("handle : " + packet.getClass().getSimpleName());
SC_HandshakeResult pkt = (SC_HandshakeResult) packet;
if (pkt.getErrorCode() != 0) {
BridgePlugin.INSTANCE.getLogger().severe(
String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage()));
} else {
context.channel().attr(KNOWN_PACKETS).set(pingPackets);
BridgePlugin.INSTANCE.getLogger().info("Handshake: OK");
BridgePlugin.INSTANCE.startPing(context.channel());
}
}
}