From c44334f196cb67e568f76bba4124e0a10b45a35e Mon Sep 17 00:00:00 2001 From: Jesper Saastamoinen Date: Fri, 13 Dec 2024 08:28:05 +0100 Subject: [PATCH] Simple socket with test client --- src/com/jsaasta/froj/stdlib/Stdlib.java | 3 ++ .../froj/stdlib/socket/ClientHandler.java | 34 +++++++++++++++++ .../froj/stdlib/socket/SocketClient.java | 34 +++++++++++++++++ .../froj/stdlib/socket/SocketServer.java | 38 +++++++++++++++++++ 4 files changed, 109 insertions(+) create mode 100644 src/com/jsaasta/froj/stdlib/socket/ClientHandler.java create mode 100644 src/com/jsaasta/froj/stdlib/socket/SocketClient.java create mode 100644 src/com/jsaasta/froj/stdlib/socket/SocketServer.java diff --git a/src/com/jsaasta/froj/stdlib/Stdlib.java b/src/com/jsaasta/froj/stdlib/Stdlib.java index 2ad7d0d..ab105cf 100644 --- a/src/com/jsaasta/froj/stdlib/Stdlib.java +++ b/src/com/jsaasta/froj/stdlib/Stdlib.java @@ -1,5 +1,7 @@ package com.jsaasta.froj.stdlib; +import com.jsaasta.froj.stdlib.socket.SocketServer; + import java.util.HashMap; import java.util.Map; @@ -12,6 +14,7 @@ public class Stdlib { classes.put("clock", new Clock()); classes.put("input", new Input()); classes.put("fileReader", new FileReader()); + classes.put("socket", new SocketServer()); } public static Map define(){ diff --git a/src/com/jsaasta/froj/stdlib/socket/ClientHandler.java b/src/com/jsaasta/froj/stdlib/socket/ClientHandler.java new file mode 100644 index 0000000..c53a775 --- /dev/null +++ b/src/com/jsaasta/froj/stdlib/socket/ClientHandler.java @@ -0,0 +1,34 @@ +package com.jsaasta.froj.stdlib.socket; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; + +class ClientHandler extends Thread { + private Socket socket; + + public ClientHandler(Socket socket) { + this.socket = socket; + } + + public void run() { + try { + InputStream in = socket.getInputStream(); + OutputStream out = socket.getOutputStream(); + + byte[] buffer = new byte[1024]; + int bytesRead = in.read(buffer); + 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 + socket.close(); + } catch (IOException e) { + System.out.println("Error handling client connection: " + e.getMessage()); + } + } +} diff --git a/src/com/jsaasta/froj/stdlib/socket/SocketClient.java b/src/com/jsaasta/froj/stdlib/socket/SocketClient.java new file mode 100644 index 0000000..8a383f7 --- /dev/null +++ b/src/com/jsaasta/froj/stdlib/socket/SocketClient.java @@ -0,0 +1,34 @@ +package com.jsaasta.froj.stdlib.socket; + +import java.io.*; +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(); + 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(); + } + } +} diff --git a/src/com/jsaasta/froj/stdlib/socket/SocketServer.java b/src/com/jsaasta/froj/stdlib/socket/SocketServer.java new file mode 100644 index 0000000..0bdc539 --- /dev/null +++ b/src/com/jsaasta/froj/stdlib/socket/SocketServer.java @@ -0,0 +1,38 @@ +package com.jsaasta.froj.stdlib.socket; + +import com.jsaasta.froj.FrojCallable; +import com.jsaasta.froj.Interpreter; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.List; + +public class SocketServer implements FrojCallable { + @Override + public int arity() { + return 1; + } + + @Override + public Object call(Interpreter interpreter, List arguments) { + try { + Double param = (Double) arguments.get(0); + int port = param.intValue(); + ServerSocket serverSocket = new ServerSocket(port); + System.out.println("Server started. Listening for incoming connections..."); + + while (true) { + Socket socket = serverSocket.accept(); + System.out.println("Incoming connection from " + socket.getInetAddress()); + + ClientHandler clientHandler = new ClientHandler(socket); + clientHandler.start(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } +}