From 8c648787092856095e286c9cb3f5121897dd4c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thalys=20M=C3=A1rcio?= Date: Wed, 22 Dec 2021 13:10:52 -0300 Subject: [PATCH] Example Bind --- ..._apache_logging_log4j_log4j_api_2_16_0.xml | 13 +++ ...apache_logging_log4j_log4j_core_2_16_0.xml | 13 +++ MMOServer.iml | 5 +- pom.xml | 5 ++ src/examples/java/MMOServer.java | 12 +++ src/examples/java/network/NetworkFactory.java | 12 +++ src/examples/java/network/NetworkSession.java | 33 ++++++++ .../java/mmo/core/netty/ChannelAdapter.kt | 2 +- .../java/mmo/core/netty/NettyBootstrap.kt | 27 +++--- .../mmo/core/netty/SessionHandlerAdapter.kt | 21 +++-- .../mmo/core/netty/codec/MessageDecoder.java | 17 ---- .../mmo/core/netty/codec/MessageDecoder.kt | 12 +++ .../mmo/core/netty/codec/MessageEncoder.kt | 11 +++ src/main/java/mmo/core/network/Channel.kt | 5 +- src/main/java/mmo/core/session/Session.kt | 7 +- .../java/mmo/core/session/SessionFactory.kt | 2 +- src/main/resources/log4j2.xml | 77 ++++++++++++++++++ src/test/java/mmo/network/NetworkSession.java | 5 -- .../classes/META-INF/MMOServer.kotlin_module | Bin 24 -> 24 bytes target/classes/log4j2.xml | 77 ++++++++++++++++++ 20 files changed, 304 insertions(+), 52 deletions(-) create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_16_0.xml create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_16_0.xml create mode 100644 src/examples/java/MMOServer.java create mode 100644 src/examples/java/network/NetworkFactory.java create mode 100644 src/examples/java/network/NetworkSession.java delete mode 100644 src/main/java/mmo/core/netty/codec/MessageDecoder.java create mode 100644 src/main/java/mmo/core/netty/codec/MessageDecoder.kt create mode 100644 src/main/java/mmo/core/netty/codec/MessageEncoder.kt create mode 100644 src/main/resources/log4j2.xml create mode 100644 target/classes/log4j2.xml diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_16_0.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_16_0.xml new file mode 100644 index 0000000..d66bfac --- /dev/null +++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_16_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_16_0.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_16_0.xml new file mode 100644 index 0000000..2769f7e --- /dev/null +++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_16_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/MMOServer.iml b/MMOServer.iml index 663f2f9..7a8b528 100644 --- a/MMOServer.iml +++ b/MMOServer.iml @@ -6,7 +6,7 @@ - + @@ -24,6 +24,7 @@ + @@ -68,6 +69,8 @@ + + diff --git a/pom.xml b/pom.xml index f341b93..273d487 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,11 @@ 5.8.2 test + + org.apache.logging.log4j + log4j-core + 2.16.0 + org.jetbrains.kotlin kotlin-stdlib-jdk8 diff --git a/src/examples/java/MMOServer.java b/src/examples/java/MMOServer.java new file mode 100644 index 0000000..d4059a9 --- /dev/null +++ b/src/examples/java/MMOServer.java @@ -0,0 +1,12 @@ +import mmo.core.netty.NettyBootstrap; +import network.NetworkFactory; + +import java.time.Duration; + +public class MMOServer { + + public static void main(String[] args) { + NettyBootstrap bootstrap = new NettyBootstrap(new NetworkFactory(), 10000, Duration.ofSeconds(10)); + bootstrap.build(); + } +} diff --git a/src/examples/java/network/NetworkFactory.java b/src/examples/java/network/NetworkFactory.java new file mode 100644 index 0000000..ab5c1ef --- /dev/null +++ b/src/examples/java/network/NetworkFactory.java @@ -0,0 +1,12 @@ +package network; + +import mmo.core.netty.ChannelAdapter; +import mmo.core.session.Session; +import mmo.core.session.SessionFactory; + +public class NetworkFactory implements SessionFactory { + @Override + public Session create(ChannelAdapter channel) { + return new NetworkSession(channel); + } +} diff --git a/src/examples/java/network/NetworkSession.java b/src/examples/java/network/NetworkSession.java new file mode 100644 index 0000000..c2ec32d --- /dev/null +++ b/src/examples/java/network/NetworkSession.java @@ -0,0 +1,33 @@ +package network; + +import mmo.core.netty.ChannelAdapter; +import mmo.core.network.Channel; +import mmo.core.session.Session; + +public class NetworkSession implements Session { + private ChannelAdapter channel; + + public NetworkSession(ChannelAdapter channel) { + this.channel = channel; + } + + @Override + public void close() { + + } + + @Override + public void receive(Object msg) { + + } + + @Override + public void inactive() { + + } + + @Override + public ChannelAdapter channel() { + return channel; + } +} diff --git a/src/main/java/mmo/core/netty/ChannelAdapter.kt b/src/main/java/mmo/core/netty/ChannelAdapter.kt index dfb0c15..4991163 100644 --- a/src/main/java/mmo/core/netty/ChannelAdapter.kt +++ b/src/main/java/mmo/core/netty/ChannelAdapter.kt @@ -21,7 +21,7 @@ class ChannelAdapter(private val channel: ChannelHandlerContext) : Channel { override val isAlive: Boolean get() = channel.channel().isActive - override fun address(): InetSocketAddress? { + override fun address(): InetSocketAddress { return channel.channel().remoteAddress() as InetSocketAddress } } \ No newline at end of file diff --git a/src/main/java/mmo/core/netty/NettyBootstrap.kt b/src/main/java/mmo/core/netty/NettyBootstrap.kt index 77fb5be..79e0c8a 100644 --- a/src/main/java/mmo/core/netty/NettyBootstrap.kt +++ b/src/main/java/mmo/core/netty/NettyBootstrap.kt @@ -1,27 +1,28 @@ package mmo.core.netty import io.netty.bootstrap.ServerBootstrap +import io.netty.buffer.Unpooled import io.netty.channel.Channel -import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelInitializer import io.netty.channel.EventLoopGroup import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioServerSocketChannel -import io.netty.handler.timeout.IdleStateEvent -import io.netty.handler.timeout.IdleStateHandler +import io.netty.handler.codec.DelimiterBasedFrameDecoder import mmo.core.Server import mmo.core.netty.codec.MessageDecoder -import mmo.core.network.SessionIdle +import mmo.core.netty.codec.MessageEncoder import mmo.core.session.Session import mmo.core.session.SessionFactory +import org.apache.logging.log4j.LogManager import java.time.Duration -import java.util.concurrent.TimeUnit class NettyBootstrap(private val factory: SessionFactory, private val port: Int, private val inactivityDuration: Duration) : Server { private var channel: Channel? = null private var eventLoopGroup: EventLoopGroup? = null private var sessionHandlerAdapter: SessionHandlerAdapter? = null + private val logger = LogManager.getLogger(javaClass) override fun build() { + logger.info("building netty on network port: {}", port) val bootstrap = ServerBootstrap() .group(NioEventLoopGroup(Runtime.getRuntime().availableProcessors()).also { eventLoopGroup = it }) .channel(NioServerSocketChannel::class.java) @@ -29,17 +30,19 @@ class NettyBootstrap(private val factory: SessionFactory, priva override fun initChannel(channel: Channel) { channel .pipeline() + //.addLast(DelimiterBasedFrameDecoder(4096, Unpooled.wrappedBuffer(ByteArray(10)))) + .addLast(MessageEncoder()) .addLast(MessageDecoder()) - .addLast(object : IdleStateHandler(inactivityDuration.toMillis(), 0, 0, TimeUnit.MILLISECONDS) { - @Throws(Exception::class) - override fun channelIdle(ctx: ChannelHandlerContext, evt: IdleStateEvent) { - ctx.fireChannelRead(SessionIdle(inactivityDuration)) - } - }) + //.addLast(object : IdleStateHandler(inactivityDuration.toMillis(), 0, 0, TimeUnit.MILLISECONDS) { + // @Throws(Exception::class) + // override fun channelIdle(ctx: ChannelHandlerContext, evt: IdleStateEvent) { + // ctx.fireChannelRead(SessionIdle(inactivityDuration)) + // } + //}) .addLast(SessionHandlerAdapter(factory).also { sessionHandlerAdapter = it }) } }) - channel = bootstrap.bind(port).channel() + bootstrap.bind(port).also { channel = it.channel() } } override fun shutdown() { diff --git a/src/main/java/mmo/core/netty/SessionHandlerAdapter.kt b/src/main/java/mmo/core/netty/SessionHandlerAdapter.kt index 0e85a4a..d7d0c28 100644 --- a/src/main/java/mmo/core/netty/SessionHandlerAdapter.kt +++ b/src/main/java/mmo/core/netty/SessionHandlerAdapter.kt @@ -3,23 +3,27 @@ package mmo.core.netty import io.netty.channel.ChannelHandler.Sharable import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelId -import io.netty.channel.ChannelInboundHandlerAdapter +import io.netty.channel.SimpleChannelInboundHandler import io.netty.util.AttributeKey import mmo.core.session.Session import mmo.core.session.SessionFactory +import org.apache.logging.log4j.LogManager import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentMap @Sharable -class SessionHandlerAdapter(private val factory: SessionFactory) : ChannelInboundHandlerAdapter() { +class SessionHandlerAdapter(private val factory: SessionFactory) : SimpleChannelInboundHandler() { private val sessionAttribute = AttributeKey.valueOf("session") private val sessions: ConcurrentMap = ConcurrentHashMap() + private val logger = LogManager.getLogger(javaClass) fun sessions(): Collection { return sessions.values } - override fun channelActive(ctx: ChannelHandlerContext) { + @Throws(Exception::class) + override fun channelRegistered(ctx: ChannelHandlerContext) { val session = factory.create(ChannelAdapter(ctx)) + logger.info("new connection from address: {}", session!!.channel().address()) ctx .channel() .attr(sessionAttribute) @@ -27,13 +31,16 @@ class SessionHandlerAdapter(private val factory: SessionFactory sessions[ctx.channel().id()] = session } - override fun channelInactive(ctx: ChannelHandlerContext) { + @Throws(Exception::class) + override fun channelUnregistered(ctx: ChannelHandlerContext) { ctx.channel().attr(sessionAttribute).get()!!.inactive() } - override fun channelRead(ctx: ChannelHandlerContext, msg: Any) { - ctx.channel().attr(sessionAttribute).get()!!.receive(msg) + @Throws(Exception::class) + public override fun channelRead0(ctx: ChannelHandlerContext?, message: Any?) { } - override fun exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable) {} + @Throws(Exception::class) + override fun exceptionCaught(ctx: ChannelHandlerContext?, cause: Throwable?) { + } } \ No newline at end of file diff --git a/src/main/java/mmo/core/netty/codec/MessageDecoder.java b/src/main/java/mmo/core/netty/codec/MessageDecoder.java deleted file mode 100644 index 2fe8101..0000000 --- a/src/main/java/mmo/core/netty/codec/MessageDecoder.java +++ /dev/null @@ -1,17 +0,0 @@ -package mmo.core.netty.codec; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; - -import java.util.List; - -public class MessageDecoder extends ByteToMessageDecoder { - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - if (in.readableBytes() < 6) - return; - - } -} diff --git a/src/main/java/mmo/core/netty/codec/MessageDecoder.kt b/src/main/java/mmo/core/netty/codec/MessageDecoder.kt new file mode 100644 index 0000000..0329ef2 --- /dev/null +++ b/src/main/java/mmo/core/netty/codec/MessageDecoder.kt @@ -0,0 +1,12 @@ +package mmo.core.netty.codec + +import io.netty.buffer.ByteBuf +import io.netty.channel.ChannelHandlerContext +import io.netty.handler.codec.ByteToMessageDecoder + +class MessageDecoder : ByteToMessageDecoder() { + @Throws(Exception::class) + override fun decode(ctx: ChannelHandlerContext, `in`: ByteBuf, out: List) { + if (`in`.readableBytes() < 6) return + } +} \ No newline at end of file diff --git a/src/main/java/mmo/core/netty/codec/MessageEncoder.kt b/src/main/java/mmo/core/netty/codec/MessageEncoder.kt new file mode 100644 index 0000000..4334214 --- /dev/null +++ b/src/main/java/mmo/core/netty/codec/MessageEncoder.kt @@ -0,0 +1,11 @@ +package mmo.core.netty.codec + +import io.netty.buffer.ByteBuf +import io.netty.channel.ChannelHandlerContext +import io.netty.handler.codec.MessageToByteEncoder + +class MessageEncoder : MessageToByteEncoder() { + @Throws(Exception::class) + override fun encode(channelHandlerContext: ChannelHandlerContext, o: Any?, byteBuf: ByteBuf) { + } +} \ No newline at end of file diff --git a/src/main/java/mmo/core/network/Channel.kt b/src/main/java/mmo/core/network/Channel.kt index 9f90f0e..b7b156c 100644 --- a/src/main/java/mmo/core/network/Channel.kt +++ b/src/main/java/mmo/core/network/Channel.kt @@ -1,12 +1,13 @@ package mmo.core.network +import io.netty.channel.ChannelId import java.net.InetSocketAddress interface Channel { /** * Get the channel id */ - fun id(): Any? + fun id(): ChannelId? /** * Write message to the channel @@ -28,5 +29,5 @@ interface Channel { /** * Get the client address */ - fun address(): InetSocketAddress? + fun address(): InetSocketAddress } \ No newline at end of file diff --git a/src/main/java/mmo/core/session/Session.kt b/src/main/java/mmo/core/session/Session.kt index ab810b4..38aba38 100644 --- a/src/main/java/mmo/core/session/Session.kt +++ b/src/main/java/mmo/core/session/Session.kt @@ -3,11 +3,6 @@ package mmo.core.session import mmo.core.netty.ChannelAdapter interface Session { - /** - * Check if the session is alive - */ - val isAlive: Boolean - /** * Close the session */ @@ -28,5 +23,5 @@ interface Session { /** * Return IO channel */ - fun channel(): ChannelAdapter? + fun channel(): ChannelAdapter } \ No newline at end of file diff --git a/src/main/java/mmo/core/session/SessionFactory.kt b/src/main/java/mmo/core/session/SessionFactory.kt index 7d099a0..44b9f4d 100644 --- a/src/main/java/mmo/core/session/SessionFactory.kt +++ b/src/main/java/mmo/core/session/SessionFactory.kt @@ -6,5 +6,5 @@ interface SessionFactory { /** * Create the session from the channel */ - fun create(channel: ChannelAdapter?): S + fun create(channel: ChannelAdapter): S } \ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml new file mode 100644 index 0000000..9c04336 --- /dev/null +++ b/src/main/resources/log4j2.xml @@ -0,0 +1,77 @@ + + + + %d %p %c{1.} [%t] %m%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/mmo/network/NetworkSession.java b/src/test/java/mmo/network/NetworkSession.java index 29627ff..5825caa 100644 --- a/src/test/java/mmo/network/NetworkSession.java +++ b/src/test/java/mmo/network/NetworkSession.java @@ -9,11 +9,6 @@ public NetworkSession(ChannelAdapter channel) { } - @Override - public boolean isAlive() { - return false; - } - @Override public void close() { diff --git a/target/classes/META-INF/MMOServer.kotlin_module b/target/classes/META-INF/MMOServer.kotlin_module index 70f0f69f7a9f32eb025f2de34fe1bb071ce3d543..3a4e3bfdc5206ad63549c999fba03d3a9a3b2308 100644 GIT binary patch literal 24 YcmZQzU|?ooU| + + + %d %p %c{1.} [%t] %m%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file