diff --git a/src/main/java/org/juv25d/App.java b/src/main/java/org/juv25d/App.java index 0df3c3d0..74d33459 100644 --- a/src/main/java/org/juv25d/App.java +++ b/src/main/java/org/juv25d/App.java @@ -1,7 +1,22 @@ package org.juv25d; +import org.juv25d.logging.ServerLogging; +import org.juv25d.parser.HttpParser; + +import java.util.logging.Logger; + public class App { public static void main(String[] args) { - SocketServer.createSocket(); + Logger logger = ServerLogging.getLogger(); + HttpParser httpParser = new HttpParser(); + DefaultConnectionHandlerFactory handlerFactory = + new DefaultConnectionHandlerFactory(httpParser, logger); + + Server server = new Server( + logger, + handlerFactory + ); + + server.start(); } } diff --git a/src/main/java/org/juv25d/ConnectionHandler.java b/src/main/java/org/juv25d/ConnectionHandler.java new file mode 100644 index 00000000..a44a8bd3 --- /dev/null +++ b/src/main/java/org/juv25d/ConnectionHandler.java @@ -0,0 +1,31 @@ +package org.juv25d; + +import org.juv25d.parser.HttpParser; +import java.io.IOException; +import java.net.Socket; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class ConnectionHandler implements Runnable { + private final Socket socket; + private final HttpParser httpParser; + private final Logger logger; + + public ConnectionHandler(Socket socket, HttpParser httpParser, Logger logger) { + this.socket = socket; + this.httpParser = httpParser; + this.logger = logger; + } + + @Override + public void run() { + try (socket) { + HttpRequest request = httpParser.parse(socket.getInputStream()); + + logger.info("Handling request: " + request.method() + " " + request.path()); + + } catch (IOException e) { + logger.log(Level.SEVERE, "Error while handling request", e); + } + } +} diff --git a/src/main/java/org/juv25d/ConnectionHandlerFactory.java b/src/main/java/org/juv25d/ConnectionHandlerFactory.java new file mode 100644 index 00000000..9ac8e35b --- /dev/null +++ b/src/main/java/org/juv25d/ConnectionHandlerFactory.java @@ -0,0 +1,7 @@ +package org.juv25d; + +import java.net.Socket; + +public interface ConnectionHandlerFactory { + Runnable create(Socket socket); +} diff --git a/src/main/java/org/juv25d/DefaultConnectionHandlerFactory.java b/src/main/java/org/juv25d/DefaultConnectionHandlerFactory.java new file mode 100644 index 00000000..7e043bad --- /dev/null +++ b/src/main/java/org/juv25d/DefaultConnectionHandlerFactory.java @@ -0,0 +1,21 @@ +package org.juv25d; + +import org.juv25d.parser.HttpParser; + +import java.net.Socket; +import java.util.logging.Logger; + +public class DefaultConnectionHandlerFactory implements ConnectionHandlerFactory{ + private final HttpParser httpParser; + private final Logger logger; + + public DefaultConnectionHandlerFactory(HttpParser httpParser, Logger logger) { + this.httpParser = httpParser; + this.logger = logger; + } + + @Override + public Runnable create(Socket socket) { + return new ConnectionHandler(socket, httpParser, logger); + } +} diff --git a/src/main/java/org/juv25d/Server.java b/src/main/java/org/juv25d/Server.java new file mode 100644 index 00000000..1b1835cc --- /dev/null +++ b/src/main/java/org/juv25d/Server.java @@ -0,0 +1,32 @@ +package org.juv25d; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.logging.Logger; + +public class Server { + private static final int PORT = 3000; + private final Logger logger; + private final ConnectionHandlerFactory handlerFactory; + + public Server(Logger logger, ConnectionHandlerFactory handlerFactory) { + this.logger = logger; + this.handlerFactory = handlerFactory; + } + + public void start() { + try (ServerSocket serverSocket = new ServerSocket(PORT, 64)) { + logger.info("Server started at port: " + serverSocket.getLocalPort()); + + while (true) { + Socket socket = serverSocket.accept(); + Runnable handler = handlerFactory.create(socket); + Thread.ofVirtual().start(handler); + } + + } catch (IOException e) { + throw new RuntimeException("Server error", e); + } + } +} diff --git a/src/main/java/org/juv25d/SocketServer.java b/src/main/java/org/juv25d/SocketServer.java deleted file mode 100644 index d04fc744..00000000 --- a/src/main/java/org/juv25d/SocketServer.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.juv25d; - -import org.juv25d.parser.HttpParser; -import org.juv25d.logging.ServerLogging; - -import java.io.IOException; -import java.io.InputStream; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class SocketServer { - private final HttpParser httpParser; - - public SocketServer(HttpParser httpParser) { - this.httpParser = httpParser; - } - - private static final Logger logger = ServerLogging.getLogger(); - - static void createSocket() { - int port = 3000; - - try (ServerSocket serverSocket = new ServerSocket(port, 64)) { - - logger.info("Server started at port: " + serverSocket.getLocalPort()); - - while (true) { - Socket socket = serverSocket.accept(); - logger.info("Client connected from: " + socket.getInetAddress().getHostAddress()); - - Thread.ofVirtual().start(() -> handleClient(socket)); - } - - } catch (IOException e) { - logger.log(Level.SEVERE, "Server socket error: " + e); - } - } - - static void handleClient(Socket socket) { - try (socket) { - InputStream in = socket.getInputStream(); - - HttpParser parser = new HttpParser(); - HttpRequest request = parser.parse(in); - - logger.info("Method: " + request.method()); - logger.info("Path: " + request.path()); - - } catch (IOException e) { - logger.log(Level.WARNING, "Error handling client ",e); - } - } -}