diff --git a/child-side/src/main/kotlin/cc/maxmc/msm/child/MultiServerMan.kt b/child-side/src/main/kotlin/cc/maxmc/msm/child/MultiServerMan.kt new file mode 100644 index 0000000..62a1b14 --- /dev/null +++ b/child-side/src/main/kotlin/cc/maxmc/msm/child/MultiServerMan.kt @@ -0,0 +1,25 @@ +package cc.maxmc.msm.child + +import cc.maxmc.msm.child.listener.PacketListener +import cc.maxmc.msm.child.netty.NetClient +import net.md_5.bungee.api.ProxyServer +import net.md_5.bungee.api.plugin.Plugin + +class MultiServerMan : Plugin() { + init { + instance = this + } + + override fun onEnable() { + ProxyServer.getInstance().pluginManager.registerListener(this, PacketListener) + NetClient + } + + override fun onDisable() { + NetClient.shutdown() + } + + companion object { + lateinit var instance: MultiServerMan + } +} \ No newline at end of file diff --git a/child-side/src/main/kotlin/cc/maxmc/msm/child/listener/PacketListener.kt b/child-side/src/main/kotlin/cc/maxmc/msm/child/listener/PacketListener.kt new file mode 100644 index 0000000..946967a --- /dev/null +++ b/child-side/src/main/kotlin/cc/maxmc/msm/child/listener/PacketListener.kt @@ -0,0 +1,20 @@ +package cc.maxmc.msm.child.listener + +import cc.maxmc.msm.child.utils.log +import cc.maxmc.msm.common.event.PacketReceiveEvent +import cc.maxmc.msm.common.network.packet.CPacketDebug +import cc.maxmc.msm.common.network.packet.PPacketDebug +import net.md_5.bungee.api.plugin.Listener +import net.md_5.bungee.event.EventHandler + +object PacketListener : Listener { + @EventHandler + fun onPacket(evt: PacketReceiveEvent) { + val packet = evt.packet + if (packet !is CPacketDebug) { + return + } + log("§fDEBUG | §7收到: \"${packet.content}\"") + evt.channel.writeAndFlush(PPacketDebug("(${evt.channel.localAddress()}) - ${packet.content}")) + } +} \ No newline at end of file diff --git a/child-side/src/main/kotlin/cc/maxmc/msm/child/netty/ClientPacketHandler.kt b/child-side/src/main/kotlin/cc/maxmc/msm/child/netty/ClientPacketHandler.kt new file mode 100644 index 0000000..ead5ffc --- /dev/null +++ b/child-side/src/main/kotlin/cc/maxmc/msm/child/netty/ClientPacketHandler.kt @@ -0,0 +1,13 @@ +package cc.maxmc.msm.child.netty + +import cc.maxmc.msm.common.event.PacketReceiveEvent +import cc.maxmc.msm.common.network.BungeePacket +import io.netty.channel.ChannelHandlerContext +import io.netty.channel.SimpleChannelInboundHandler + +object ClientPacketHandler : SimpleChannelInboundHandler() { + override fun channelRead0(ctx: ChannelHandlerContext, msg: BungeePacket) { + PacketReceiveEvent(ctx.channel(), msg).callEvent() + } + +} \ No newline at end of file diff --git a/child-side/src/main/kotlin/cc/maxmc/msm/child/netty/NetClient.kt b/child-side/src/main/kotlin/cc/maxmc/msm/child/netty/NetClient.kt new file mode 100644 index 0000000..4bc5eb0 --- /dev/null +++ b/child-side/src/main/kotlin/cc/maxmc/msm/child/netty/NetClient.kt @@ -0,0 +1,33 @@ +package cc.maxmc.msm.child.netty + +import cc.maxmc.msm.child.settings.Settings +import cc.maxmc.msm.child.utils.log +import cc.maxmc.msm.common.utils.pipelineInit +import io.netty.bootstrap.Bootstrap +import io.netty.channel.ChannelFutureListener +import io.netty.channel.ChannelOption +import io.netty.channel.nio.NioEventLoopGroup + +object NetClient { + private val loop = NioEventLoopGroup() + + init { + start() + } + + private fun start() { + val parent = Settings.Parent + Bootstrap() + .group(loop) + .handler(pipelineInit(ClientPacketHandler)) + .option(ChannelOption.TCP_NODELAY, true) + .remoteAddress(parent.address, parent.port) + .connect().addListener(ChannelFutureListener { + log("§a| §7成功连接到集群的主节点. (${it.channel().remoteAddress()})") + }) + } + + fun shutdown() { + loop.shutdownGracefully().sync() + } +} \ No newline at end of file diff --git a/child-side/src/main/kotlin/cc/maxmc/msm/child/settings/Settings.kt b/child-side/src/main/kotlin/cc/maxmc/msm/child/settings/Settings.kt new file mode 100644 index 0000000..ffe7c5d --- /dev/null +++ b/child-side/src/main/kotlin/cc/maxmc/msm/child/settings/Settings.kt @@ -0,0 +1,15 @@ +package cc.maxmc.msm.child.settings + +import cc.maxmc.msm.child.settings.SettingsReader.config + +object Settings { + val name + get() = config + + object Parent { + val address: String + get() = config.getString("parent.address", "localhost") + val port: Int + get() = config.getInt("parent.port", 23333) + } +} \ No newline at end of file diff --git a/child-side/src/main/kotlin/cc/maxmc/msm/child/settings/SettingsReader.kt b/child-side/src/main/kotlin/cc/maxmc/msm/child/settings/SettingsReader.kt new file mode 100644 index 0000000..8cafb50 --- /dev/null +++ b/child-side/src/main/kotlin/cc/maxmc/msm/child/settings/SettingsReader.kt @@ -0,0 +1,25 @@ +package cc.maxmc.msm.child.settings + +import cc.maxmc.msm.child.MultiServerMan +import net.md_5.bungee.api.ProxyServer +import net.md_5.bungee.api.chat.TextComponent +import net.md_5.bungee.config.Configuration +import net.md_5.bungee.config.ConfigurationProvider +import net.md_5.bungee.config.YamlConfiguration +import kotlin.io.path.* + +object SettingsReader { + private val file = MultiServerMan.instance.dataFolder.toPath().resolve("settings.yml") + val config: Configuration + + init { + if (!file.exists()) { + MultiServerMan.instance.dataFolder.toPath().createDirectories() + val stream = MultiServerMan.instance.getResourceAsStream("settings.yml") + file.createFile() + stream.copyTo(file.outputStream()) + ProxyServer.getInstance().console.sendMessage(TextComponent("§b| §7配置文件不存在,正在创建配置文件。")) + } + config = ConfigurationProvider.getProvider(YamlConfiguration::class.java).load(file.inputStream()) + } +} \ No newline at end of file diff --git a/child-side/src/main/kotlin/cc/maxmc/msm/child/utils/Logging.kt b/child-side/src/main/kotlin/cc/maxmc/msm/child/utils/Logging.kt new file mode 100644 index 0000000..cc34b7f --- /dev/null +++ b/child-side/src/main/kotlin/cc/maxmc/msm/child/utils/Logging.kt @@ -0,0 +1,8 @@ +package cc.maxmc.msm.child.utils + +import net.md_5.bungee.api.ProxyServer +import net.md_5.bungee.api.chat.TextComponent + +fun log(msg: String) { + ProxyServer.getInstance().console.sendMessage(TextComponent(msg)) +} \ No newline at end of file diff --git a/child-side/src/main/kotlin/cc/maxmc/msm/parent/MultiServerMan.kt b/child-side/src/main/kotlin/cc/maxmc/msm/parent/MultiServerMan.kt deleted file mode 100644 index c2ffe87..0000000 --- a/child-side/src/main/kotlin/cc/maxmc/msm/parent/MultiServerMan.kt +++ /dev/null @@ -1,18 +0,0 @@ -package cc.maxmc.msm.child - -import cc.maxmc.msm.common.Placeholder -import cc.maxmc.msm.common.network.netty.NetworkRegistry -import net.md_5.bungee.api.plugin.Plugin - -class MultiServerMan : Plugin() { - - override fun onEnable() { - Placeholder.inject(NetworkRegistry.PacketDirection.CHILD_BOUND) - - } - - override fun onDisable() { - - } - -} \ No newline at end of file diff --git a/child-side/src/main/resources/settings.yml b/child-side/src/main/resources/settings.yml new file mode 100644 index 0000000..4f36cc3 --- /dev/null +++ b/child-side/src/main/resources/settings.yml @@ -0,0 +1,3 @@ +parent: + address: 127.0.0.1 + port: 23333 diff --git a/common/src/main/kotlin/cc/maxmc/msm/common/event/PacketReceiveEvent.kt b/common/src/main/kotlin/cc/maxmc/msm/common/event/PacketReceiveEvent.kt new file mode 100644 index 0000000..fe735b4 --- /dev/null +++ b/common/src/main/kotlin/cc/maxmc/msm/common/event/PacketReceiveEvent.kt @@ -0,0 +1,7 @@ +package cc.maxmc.msm.common.event + +import cc.maxmc.msm.common.network.BungeePacket +import io.netty.channel.Channel +import net.md_5.bungee.api.plugin.Event + +data class PacketReceiveEvent(val channel: Channel, val packet: BungeePacket) : Event() \ No newline at end of file diff --git a/common/src/main/kotlin/cc/maxmc/msm/common/network/ClusterMsgCodec.kt b/common/src/main/kotlin/cc/maxmc/msm/common/network/netty/ClusterMsgCodec.kt similarity index 87% rename from common/src/main/kotlin/cc/maxmc/msm/common/network/ClusterMsgCodec.kt rename to common/src/main/kotlin/cc/maxmc/msm/common/network/netty/ClusterMsgCodec.kt index 9fd4cd3..aac211c 100644 --- a/common/src/main/kotlin/cc/maxmc/msm/common/network/ClusterMsgCodec.kt +++ b/common/src/main/kotlin/cc/maxmc/msm/common/network/netty/ClusterMsgCodec.kt @@ -1,6 +1,6 @@ -package cc.maxmc.msm.common.network +package cc.maxmc.msm.common.network.netty -import cc.maxmc.msm.common.network.netty.NetworkRegistry +import cc.maxmc.msm.common.network.BungeePacket import io.netty.buffer.ByteBuf import io.netty.channel.ChannelHandlerContext import io.netty.handler.codec.ByteToMessageCodec diff --git a/common/src/main/kotlin/cc/maxmc/msm/common/utils/Netty.kt b/common/src/main/kotlin/cc/maxmc/msm/common/utils/Netty.kt new file mode 100644 index 0000000..111d1a8 --- /dev/null +++ b/common/src/main/kotlin/cc/maxmc/msm/common/utils/Netty.kt @@ -0,0 +1,23 @@ +package cc.maxmc.msm.common.utils + +import cc.maxmc.msm.common.network.netty.ClusterMsgCodec +import cc.maxmc.msm.common.network.netty.NetworkRegistry +import io.netty.channel.Channel +import io.netty.channel.ChannelInitializer +import io.netty.channel.SimpleChannelInboundHandler +import io.netty.channel.socket.SocketChannel +import net.md_5.bungee.protocol.Varint21FrameDecoder +import net.md_5.bungee.protocol.Varint21LengthFieldPrepender + +fun channelInit(initializer: C.() -> Unit): ChannelInitializer { + return object : ChannelInitializer() { + override fun initChannel(ch: C) = initializer(ch) + } +} + +fun pipelineInit(packetHandler: SimpleChannelInboundHandler) = channelInit { + pipeline().addLast("frame_decoder", Varint21FrameDecoder()) + pipeline().addLast("codec", ClusterMsgCodec(NetworkRegistry.PacketDirection.CHILD_BOUND)) + pipeline().addLast("frame_prepender", Varint21LengthFieldPrepender()) + pipeline().addLast("packet_handler", packetHandler) +} \ No newline at end of file diff --git a/parent-side/src/main/kotlin/cc/maxmc/msm/parent/MultiServerMan.kt b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/MultiServerMan.kt index 9aa2fcd..422109b 100644 --- a/parent-side/src/main/kotlin/cc/maxmc/msm/parent/MultiServerMan.kt +++ b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/MultiServerMan.kt @@ -1,19 +1,23 @@ package cc.maxmc.msm.parent -import cc.maxmc.msm.common.Placeholder -import cc.maxmc.msm.common.network.netty.NetworkRegistry -import command.Send +import cc.maxmc.msm.parent.command.Send import net.md_5.bungee.api.ProxyServer import net.md_5.bungee.api.plugin.Plugin class MultiServerMan : Plugin() { + override fun onEnable() { + instance = this ProxyServer.getInstance().pluginManager.registerCommand(this, Send) - Placeholder.inject(NetworkRegistry.PacketDirection.PARENT_BOUND) } override fun onDisable() { } + companion object { + lateinit var instance: MultiServerMan + private set + } + } \ No newline at end of file diff --git a/parent-side/src/main/kotlin/command/Send.kt b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/command/Send.kt similarity index 55% rename from parent-side/src/main/kotlin/command/Send.kt rename to parent-side/src/main/kotlin/cc/maxmc/msm/parent/command/Send.kt index 8f003c1..9352b6c 100644 --- a/parent-side/src/main/kotlin/command/Send.kt +++ b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/command/Send.kt @@ -1,12 +1,13 @@ -package command +package cc.maxmc.msm.parent.command import net.md_5.bungee.api.CommandSender +import net.md_5.bungee.api.chat.TextComponent import net.md_5.bungee.api.plugin.Command -object Send: Command("debugP") { +object Send : Command("debugP") { override fun execute(sender: CommandSender, args: Array) { val content = args.joinToString(" ") - sender.sendMessage("Success.") + sender.sendMessage(TextComponent("Success.")) } } \ No newline at end of file diff --git a/parent-side/src/main/kotlin/cc/maxmc/msm/parent/netty/NetManager.kt b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/netty/NetManager.kt new file mode 100644 index 0000000..cb60dcc --- /dev/null +++ b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/netty/NetManager.kt @@ -0,0 +1,23 @@ +package cc.maxmc.msm.parent.netty + +import cc.maxmc.msm.common.utils.pipelineInit +import cc.maxmc.msm.parent.settings.Settings +import io.netty.bootstrap.ServerBootstrap +import io.netty.channel.nio.NioEventLoopGroup + +object NetManager { + val parentGroup = NioEventLoopGroup() + val childGroup = NioEventLoopGroup() + + init { + + } + + fun startServer() { + ServerBootstrap() + .group(parentGroup, childGroup) + .childHandler(pipelineInit()) + .bind(Settings.serverPort) + } + +} \ No newline at end of file diff --git a/parent-side/src/main/kotlin/cc/maxmc/msm/parent/netty/ParentPacketHandler.kt b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/netty/ParentPacketHandler.kt new file mode 100644 index 0000000..9fc2e1a --- /dev/null +++ b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/netty/ParentPacketHandler.kt @@ -0,0 +1,4 @@ +package cc.maxmc.msm.parent.netty + +object ParentPacketHandler { +} \ No newline at end of file diff --git a/parent-side/src/main/kotlin/cc/maxmc/msm/parent/network/NetManager.kt b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/network/NetManager.kt deleted file mode 100644 index f9e66df..0000000 --- a/parent-side/src/main/kotlin/cc/maxmc/msm/parent/network/NetManager.kt +++ /dev/null @@ -1,9 +0,0 @@ -package cc.maxmc.msm.parent.network - -import cc.maxmc.msm.common.network.netty.NetworkRegistry - -object NetManager { - private val current = NetworkRegistry.PacketDirection.PARENT_BOUND - - -} \ No newline at end of file diff --git a/parent-side/src/main/kotlin/cc/maxmc/msm/parent/settings/Settings.kt b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/settings/Settings.kt new file mode 100644 index 0000000..82c5a37 --- /dev/null +++ b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/settings/Settings.kt @@ -0,0 +1,10 @@ +package cc.maxmc.msm.parent.settings + +import cc.maxmc.msm.parent.settings.SettingsReader.config + +object Settings { + val name + get() = config + val serverPort + get() = config.getInt("server_port", 25566) +} \ No newline at end of file diff --git a/parent-side/src/main/kotlin/cc/maxmc/msm/parent/settings/SettingsReader.kt b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/settings/SettingsReader.kt new file mode 100644 index 0000000..ff1837c --- /dev/null +++ b/parent-side/src/main/kotlin/cc/maxmc/msm/parent/settings/SettingsReader.kt @@ -0,0 +1,25 @@ +package cc.maxmc.msm.parent.settings + +import cc.maxmc.msm.parent.MultiServerMan +import net.md_5.bungee.api.ProxyServer +import net.md_5.bungee.api.chat.TextComponent +import net.md_5.bungee.config.Configuration +import net.md_5.bungee.config.ConfigurationProvider +import net.md_5.bungee.config.YamlConfiguration +import kotlin.io.path.* + +object SettingsReader { + private val file = MultiServerMan.instance.dataFolder.toPath().resolve("settings.yml") + val config: Configuration + + init { + if (!file.exists()) { + MultiServerMan.instance.dataFolder.toPath().createDirectories() + val stream = MultiServerMan.instance.getResourceAsStream("settings.yml") + file.createFile() + stream.copyTo(file.outputStream()) + ProxyServer.getInstance().console.sendMessage(TextComponent("§b| §7配置文件不存在,正在创建配置文件。")) + } + config = ConfigurationProvider.getProvider(YamlConfiguration::class.java).load(file.inputStream()) + } +} \ No newline at end of file