From 7494c3f92c1ef1c9d62b2cf79ba2abd31953bff4 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 9 May 2020 22:28:43 +0300 Subject: [PATCH] dumb server --- build.gradle | 29 +++++++++ src/main/java/mc/server/Main.java | 10 ++- .../java/mc/server/config/NetworkModule.java | 63 +++++++++++++++++++ src/main/java/mc/server/network/Server.java | 6 ++ .../mc/server/network/impl/NettyServer.java | 29 +++++++++ 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/main/java/mc/server/config/NetworkModule.java create mode 100644 src/main/java/mc/server/network/Server.java create mode 100644 src/main/java/mc/server/network/impl/NettyServer.java diff --git a/build.gradle b/build.gradle index 0205135..e55d1f2 100644 --- a/build.gradle +++ b/build.gradle @@ -13,3 +13,32 @@ repositories { mavenLocal() mavenCentral() } + +ext { + slf4j_version = '1.7.30' + logback_version = '1.2.3' + + library = [ + guice: ['com.google.inject:guice:4.1.0'], + logger: ["ch.qos.logback:logback-core:$logback_version", + "ch.qos.logback:logback-classic:$logback_version"], + lombok: ['org.projectlombok:lombok:1.18.2'], + netty: ['io.netty:netty-all:4.1.22.Final'], + slf4j: ["org.slf4j:slf4j-api:$slf4j_version", + "org.slf4j:jcl-over-slf4j:$slf4j_version"], + ] +} + +dependencies { + /* LOGGER */ + implementation library.slf4j + implementation library.logger + + /* LOMBOK */ + annotationProcessor library.lombok + compileOnly library.lombok + + /* COMPONENTS */ + implementation library.guice + implementation library.netty +} \ No newline at end of file diff --git a/src/main/java/mc/server/Main.java b/src/main/java/mc/server/Main.java index 107397e..1ea7689 100644 --- a/src/main/java/mc/server/Main.java +++ b/src/main/java/mc/server/Main.java @@ -1,8 +1,16 @@ package mc.server; +import com.google.inject.Guice; +import com.google.inject.Injector; +import mc.server.config.NetworkModule; +import mc.server.network.Server; + public class Main { public static void main(String[] args) { - System.out.println("hello?"); + final Injector injector = Guice.createInjector(new NetworkModule()); + + final Server server = injector.getInstance(Server.class); + server.start("127.0.0.1", 25565); } } diff --git a/src/main/java/mc/server/config/NetworkModule.java b/src/main/java/mc/server/config/NetworkModule.java new file mode 100644 index 0000000..f6874f8 --- /dev/null +++ b/src/main/java/mc/server/config/NetworkModule.java @@ -0,0 +1,63 @@ +package mc.server.config; + +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Singleton; +import com.google.inject.name.Named; +import com.google.inject.name.Names; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LoggingHandler; +import mc.server.network.Server; +import mc.server.network.impl.NettyServer; + +import java.util.Collections; +import java.util.List; + +public class NetworkModule extends AbstractModule { + + @Override + protected void configure() { + bind(Server.class).to(NettyServer.class).in(Singleton.class); + bind(EventLoopGroup.class).annotatedWith(Names.named("bossGroup")).toInstance(new NioEventLoopGroup(1)); + bind(EventLoopGroup.class).annotatedWith(Names.named("workerGroup")).toInstance(new NioEventLoopGroup()); + } + + @Provides + @Singleton + ServerBootstrap serverBootstrap(@Named("bossGroup") EventLoopGroup bossGroup, + @Named("workerGroup") EventLoopGroup workerGroup, + ChannelInitializer channelChannelInitializer) { + ServerBootstrap bootstrap = new ServerBootstrap(); + + bootstrap.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(channelChannelInitializer); + + return bootstrap; + } + + @Provides + @Singleton + ChannelInitializer channelChannelInitializer(List channelHandlerList) { + return new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel socketChannel) { + final ChannelPipeline pipeline = socketChannel.pipeline(); + channelHandlerList.forEach(pipeline::addLast); + } + }; + } + + @Provides + @Singleton + List channelHandlerList() { + return Collections.singletonList(new LoggingHandler()); + } +} diff --git a/src/main/java/mc/server/network/Server.java b/src/main/java/mc/server/network/Server.java new file mode 100644 index 0000000..4b08ccc --- /dev/null +++ b/src/main/java/mc/server/network/Server.java @@ -0,0 +1,6 @@ +package mc.server.network; + +public interface Server { + + void start(String host, int port); +} diff --git a/src/main/java/mc/server/network/impl/NettyServer.java b/src/main/java/mc/server/network/impl/NettyServer.java new file mode 100644 index 0000000..2b580ae --- /dev/null +++ b/src/main/java/mc/server/network/impl/NettyServer.java @@ -0,0 +1,29 @@ +package mc.server.network.impl; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import io.netty.bootstrap.ServerBootstrap; +import lombok.extern.slf4j.Slf4j; +import mc.server.network.Server; + + +@Slf4j +public class NettyServer implements Server { + + @Inject + private Provider serverBootstrapProvider; + + @Override + public void start(String host, int port) { + try { + log.info("Network starting: {}:{}", host, port); + serverBootstrapProvider.get() + .bind(host, port) + .sync().channel().closeFuture().sync(); + } catch (InterruptedException e) { + if (log.isTraceEnabled()) { + log.trace("{}: {}", e.getClass().getSimpleName(), e.getMessage(), e); + } + } + } +}