From becc7d0afdab644442fdb3a974cb1a83166312ed Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 8 Sep 2022 01:25:43 +0300 Subject: [PATCH] commit --- .gitignore | 4 + java/client/src/socket/client/ClientApp.java | 95 +++++++++++++++ java/server/src/socket/server/ServerApp.java | 118 +++++++++++++++++++ node/index.js | 25 ++++ node/package.json | 13 ++ 5 files changed, 255 insertions(+) create mode 100644 .gitignore create mode 100644 java/client/src/socket/client/ClientApp.java create mode 100644 java/server/src/socket/server/ServerApp.java create mode 100644 node/index.js create mode 100644 node/package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa10119 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.vscode/ +.idea/ +out/ +*.iml diff --git a/java/client/src/socket/client/ClientApp.java b/java/client/src/socket/client/ClientApp.java new file mode 100644 index 0000000..535af8e --- /dev/null +++ b/java/client/src/socket/client/ClientApp.java @@ -0,0 +1,95 @@ +package socket.client; + +import java.io.*; +import java.net.Socket; +import java.util.concurrent.TimeUnit; + +public class ClientApp { + private static Socket client; + private static Thread inThread; + private static Thread outThread; + + public static void main(String[] args) throws IOException { + client = new Socket("127.0.0.1", 8888); + inThread = new Thread(ClientApp::inputHandle); + outThread = new Thread(ClientApp::outputHandle); + + inThread.start(); + outThread.start(); + + try { + inThread.join(); + outThread.join(); + } catch (InterruptedException e) { + closeConnect(); + } + } + + private static void inputHandle() { + BufferedReader in; + try { + in = new BufferedReader(new InputStreamReader(client.getInputStream())); + } catch (IOException e) { + e.printStackTrace(); + closeConnect(); + return; + } + + try { + while (!client.isClosed() || !Thread.currentThread().isInterrupted()) { + String message = in.readLine(); + if (message != null) { + System.out.printf("INCOMMING MESSAGE: %s\n", message); + } + + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + closeConnect(); + } + } + + private static void outputHandle() { + BufferedWriter out; + try { + out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); + } catch (IOException e) { + e.printStackTrace(); + closeConnect(); + return; + } + + try { + while (!client.isClosed() || !Thread.currentThread().isInterrupted()) { + String pingJson = String.format("{\"ping\": %d}\n", System.currentTimeMillis()); + out.write(pingJson); + out.flush(); + + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + closeConnect(); + } + } + + private static void closeConnect() { + inThread.interrupt(); + outThread.interrupt(); + + try { + client.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/java/server/src/socket/server/ServerApp.java b/java/server/src/socket/server/ServerApp.java new file mode 100644 index 0000000..51eb35b --- /dev/null +++ b/java/server/src/socket/server/ServerApp.java @@ -0,0 +1,118 @@ +package socket.server; + +import java.io.*; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; + +public class ServerApp { + private static final List clients = new CopyOnWriteArrayList<>(); + + @SuppressWarnings("InfiniteLoopStatement") + public static void main(String[] args) throws IOException { + ServerSocket server = new ServerSocket(8888, 50, InetAddress.getByName("localhost")); + server.setSoTimeout(5 * 1000); + + while (true) { + System.out.println("[i] wait client..."); + Socket client; + try { + client = server.accept(); + } catch (SocketTimeoutException e) { + continue; + } + + clients.add(new ClientHandler(client)); + System.out.printf("[i] client connected (%d/50).\n", clients.size()); + } + } + + public static class ClientHandler { + private final Socket client; + private final Thread inThread; + private final Thread outThread; + + public ClientHandler(Socket client) { + this.client = client; + this.inThread = new Thread(this::inputHandle); + this.outThread = new Thread(this::outputHandle); + + this.inThread.start(); + this.outThread.start(); + } + + private void inputHandle() { + BufferedReader in; + try { + in = new BufferedReader(new InputStreamReader(client.getInputStream())); + } catch (IOException e1) { + e1.printStackTrace(); + closeConnect(); + return; + } + + try { + while (!client.isClosed() || !Thread.currentThread().isInterrupted()) { + String message = in.readLine(); + if (message != null) { + System.out.printf("INCOMMING MESSAGE: %s\n", message); + } + + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + closeConnect(); + } + } + + private void outputHandle() { + BufferedWriter out; + try { + out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); + } catch (IOException e1) { + e1.printStackTrace(); + closeConnect(); + return; + } + + try { + while (!client.isClosed() || !Thread.currentThread().isInterrupted()) { + String pingJson = String.format("{\"ping\": %d}\n", System.currentTimeMillis()); + out.write(pingJson); + out.flush(); + + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + closeConnect(); + } + } + + private void closeConnect() { + this.inThread.interrupt(); + this.outThread.interrupt(); + + try { + client.close(); + } catch (IOException e) { + e.printStackTrace(); + } + clients.remove(this); + System.out.printf("[i] client close connection (%d/50)\n", clients.size()); + } + } +} diff --git a/node/index.js b/node/index.js new file mode 100644 index 0000000..67522ec --- /dev/null +++ b/node/index.js @@ -0,0 +1,25 @@ +import net from 'net' + +const host = '127.0.0.1' +const port = 8888 +const backlog = 50 +const server = net.createServer() + +server.listen(port, host, backlog) + +server.on('connection', (client) => { + console.log('[i] client connected') + + client.on('data', (data) => { + console.log('INCOMMING MESSAGE: ' + data) + }) + + let timerId = setInterval(() => { + client.write(JSON.stringify({"ping": Date.now()}) + "\n") + }, 1000) + + client.on('close', () => { + clearTimeout(timerId) + console.log('[i] client close connection') + }) +}) \ No newline at end of file diff --git a/node/package.json b/node/package.json new file mode 100644 index 0000000..71b434a --- /dev/null +++ b/node/package.json @@ -0,0 +1,13 @@ +{ + "name": "node", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "run": "node index.js" + }, + "keywords": [], + "author": "", + "license": "ISC" +}