From 47ac4552abdebbea5c8d4034124d62f53825d335 Mon Sep 17 00:00:00 2001 From: Jesper Saastamoinen Date: Fri, 13 Dec 2024 09:53:58 +0100 Subject: [PATCH] Updated Socket handling Still a WIP --- .../froj/stdlib/socket/ClientHandler.java | 9 +++- .../froj/stdlib/socket/SocketClient.java | 45 ++++++++++++++----- .../froj/stdlib/socket/SocketServer.java | 31 ++++++++++++- 3 files changed, 71 insertions(+), 14 deletions(-) diff --git a/src/com/jsaasta/froj/stdlib/socket/ClientHandler.java b/src/com/jsaasta/froj/stdlib/socket/ClientHandler.java index c53a775..68a45bd 100644 --- a/src/com/jsaasta/froj/stdlib/socket/ClientHandler.java +++ b/src/com/jsaasta/froj/stdlib/socket/ClientHandler.java @@ -19,16 +19,23 @@ class ClientHandler extends Thread { byte[] buffer = new byte[1024]; int bytesRead = in.read(buffer); + if(bytesRead == -1){ + System.out.println("Client closed the Connection"); + } String message = new String(buffer, 0, bytesRead); System.out.println("Received message from client: " + message); String response = "Hello from froj!"; out.write(response.getBytes()); - // Close the socket + SocketServer.messageQueue.put(message); + socket.close(); } catch (IOException e) { System.out.println("Error handling client connection: " + e.getMessage()); + } catch (InterruptedException e) { + throw new RuntimeException(e); } } + } diff --git a/src/com/jsaasta/froj/stdlib/socket/SocketClient.java b/src/com/jsaasta/froj/stdlib/socket/SocketClient.java index 8a383f7..0e3d507 100644 --- a/src/com/jsaasta/froj/stdlib/socket/SocketClient.java +++ b/src/com/jsaasta/froj/stdlib/socket/SocketClient.java @@ -1,34 +1,55 @@ package com.jsaasta.froj.stdlib.socket; import java.io.*; +import java.net.ConnectException; import java.net.Socket; public class SocketClient { public static void main(String[] args) throws IOException { while(true) { - Socket socket = new Socket("localhost", 8000); - System.out.println("Connected to server"); - - // Get input and output streams - OutputStream out = socket.getOutputStream(); - InputStream in = socket.getInputStream(); - InputStreamReader input = new InputStreamReader(System.in); BufferedReader reader = new BufferedReader(input); - // Send message to server String message = reader.readLine(); + String response = sendMessage(message); + if (response != null) { + System.out.println("Received response from server: " + response); + } + } + } + + public static String sendMessage(String message) throws IOException { + Socket socket = null; + try { + socket = new Socket("localhost", 8000); + System.out.println("Connected to server"); + + OutputStream out = socket.getOutputStream(); + InputStream in = socket.getInputStream(); + out.write(message.getBytes()); - // Read response from server byte[] buffer = new byte[1024]; int bytesRead = in.read(buffer); String response = new String(buffer, 0, bytesRead); - System.out.println("Received response from server: " + response); - // Close the socket - socket.close(); + return response; + } catch (ConnectException e) { + System.out.println("Connection refused. Is the server running?"); + return null; + } catch (IOException e) { + System.out.println("Error sending message: " + e.getMessage()); + return null; + } finally { + if (socket != null) { + try { + socket.close(); + } catch (IOException e) { + System.out.println("Error closing socket: " + e.getMessage()); + } + } } } + } diff --git a/src/com/jsaasta/froj/stdlib/socket/SocketServer.java b/src/com/jsaasta/froj/stdlib/socket/SocketServer.java index 0bdc539..2b7e470 100644 --- a/src/com/jsaasta/froj/stdlib/socket/SocketServer.java +++ b/src/com/jsaasta/froj/stdlib/socket/SocketServer.java @@ -2,6 +2,7 @@ package com.jsaasta.froj.stdlib.socket; import com.jsaasta.froj.FrojCallable; import com.jsaasta.froj.Interpreter; +import com.jsaasta.froj.stdlib.StdlibRuntimeError; import java.io.IOException; import java.io.InputStream; @@ -9,8 +10,12 @@ import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; public class SocketServer implements FrojCallable { + protected static BlockingQueue messageQueue = new LinkedBlockingQueue<>(); + private static ServerSocket serverSocket; @Override public int arity() { return 1; @@ -21,7 +26,7 @@ public class SocketServer implements FrojCallable { try { Double param = (Double) arguments.get(0); int port = param.intValue(); - ServerSocket serverSocket = new ServerSocket(port); + serverSocket = new ServerSocket(port); System.out.println("Server started. Listening for incoming connections..."); while (true) { @@ -30,9 +35,33 @@ public class SocketServer implements FrojCallable { ClientHandler clientHandler = new ClientHandler(socket); clientHandler.start(); + String nextMessage = getNextMessage(); + try{ + return Double.parseDouble(nextMessage); + } catch (NumberFormatException e) { + return nextMessage; + } } + } catch (IOException e) { + throw new RuntimeException(e.getMessage()); + } catch (InterruptedException e) { throw new RuntimeException(e); + } finally{ + shutdown(); } } + + public static String getNextMessage() throws InterruptedException { + return messageQueue.take(); + } + + public static void shutdown() { + try { + serverSocket.close(); + } catch (IOException e) { + System.out.println("Error shutting down server: " + e.getMessage()); + } + } + }