From 5c08c3ffb9414f175c10c76e45a60fc0fb2c4f5f Mon Sep 17 00:00:00 2001 From: Xircon Date: Sat, 21 Feb 2026 23:18:44 -0500 Subject: [PATCH] i am going to explode. --- .../java/net/xircon/xenon/client/Xenon.java | 37 +++++++++-------- .../xenon/client/io/CustomOutputStream.java | 4 +- .../java/net/xircon/xenon/client/io/Log.java | 1 - .../xenon/client/networking/Networking.java | 8 ++-- .../networking/textclient/TextClient.java | 40 +++++++++++++------ .../java/net/xircon/xenon/server/Xenon.java | 3 +- .../xenon/server/networking/Networking.java | 3 ++ .../networking/textserver/ClientHandler.java | 20 +++++++--- 8 files changed, 71 insertions(+), 45 deletions(-) diff --git a/client/src/main/java/net/xircon/xenon/client/Xenon.java b/client/src/main/java/net/xircon/xenon/client/Xenon.java index 937a380..237a44d 100644 --- a/client/src/main/java/net/xircon/xenon/client/Xenon.java +++ b/client/src/main/java/net/xircon/xenon/client/Xenon.java @@ -13,13 +13,13 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.io.PrintStream; -import java.net.Socket; import java.util.Objects; public class Xenon implements Runnable { public static void main(String[] args) {new Xenon().start();} public Color buttonColour = new Color(55, 90, 129); public Image xenonIcon; + public static JLabel serverName = new JLabel(Networking.ServerName, SwingConstants.CENTER); static final String propertiesFile = "client.properties"; // Properties @@ -56,6 +56,7 @@ public class Xenon implements Runnable { logText.setLineWrap(true); logText.setEditable(false); JScrollPane logScrollPane = new JScrollPane(logText); + logScrollPane.setAutoscrolls(true); logFrame.add(logScrollPane); PrintStream systemOutput = new PrintStream(new CustomOutputStream(logText)); System.setOut(systemOutput); @@ -176,7 +177,6 @@ public class Xenon implements Runnable { send.addActionListener(e -> { if (TextClient.socket == null || !TextClient.socket.isConnected() || TextClient.socket.isClosed()) {JOptionPane.showMessageDialog(null, "Ensure you are Connected to a Server!", "Error", JOptionPane.ERROR_MESSAGE);} else { - Log.info("Sending " + sendField.getText()); TextClient.messageBuffer = sendField.getText(); SwingUtilities.invokeLater(() -> sendField.setText("")); } @@ -194,7 +194,22 @@ public class Xenon implements Runnable { centrePanel.add(textarea, BorderLayout.CENTER); // Side Panel - JPanel sidePanel = sideJPanel(); + JPanel sidePanel = new JPanel(new BorderLayout()); + sidePanel.setBackground(new Color(60,63,65)); + JPanel bottomSidePanel = new JPanel(new BorderLayout()); + JPanel topSidePanel = new JPanel(new BorderLayout()); + + // Mute Button + JToggleButton muteButton = muteJToggleButton(); + + // Deaf Button + JToggleButton deafButton = deafJToggleButton(); + + topSidePanel.add(serverName, BorderLayout.NORTH); + bottomSidePanel.add(muteButton, BorderLayout.WEST); + bottomSidePanel.add(deafButton, BorderLayout.CENTER); + sidePanel.add(bottomSidePanel, BorderLayout.SOUTH); + sidePanel.add(topSidePanel, BorderLayout.NORTH); //Adding Components to the Frame. mainFrame.getContentPane().add(BorderLayout.NORTH, menubar); @@ -204,22 +219,6 @@ public class Xenon implements Runnable { mainFrame.setVisible(true); } - private @NonNull JPanel sideJPanel() { - JPanel sidePanel = new JPanel(new BorderLayout()); - sidePanel.setBackground(new Color(60,63,65)); - JPanel bottomSidePanel = new JPanel(new BorderLayout()); - // Mute Button - JToggleButton muteButton = muteJToggleButton(); - - // Deaf Button - JToggleButton deafButton = deafJToggleButton(); - - bottomSidePanel.add(muteButton, BorderLayout.WEST); - bottomSidePanel.add(deafButton, BorderLayout.CENTER); - sidePanel.add(bottomSidePanel, BorderLayout.SOUTH); - return sidePanel; - } - private @NonNull JToggleButton deafJToggleButton() { JToggleButton deafButton = new JToggleButton("Deafen"); deafButton.setBackground(buttonColour); diff --git a/client/src/main/java/net/xircon/xenon/client/io/CustomOutputStream.java b/client/src/main/java/net/xircon/xenon/client/io/CustomOutputStream.java index 73c6147..73d2bb3 100644 --- a/client/src/main/java/net/xircon/xenon/client/io/CustomOutputStream.java +++ b/client/src/main/java/net/xircon/xenon/client/io/CustomOutputStream.java @@ -5,14 +5,14 @@ import java.io.IOException; import java.io.OutputStream; public class CustomOutputStream extends OutputStream { - private JTextArea textArea; + private final JTextArea textArea; public CustomOutputStream(JTextArea textArea) { this.textArea = textArea; } @Override - public void write(int b) throws IOException { + public void write(int b) { // redirects data to the text area textArea.append(String.valueOf((char)b)); // scrolls the text area to the end of data diff --git a/client/src/main/java/net/xircon/xenon/client/io/Log.java b/client/src/main/java/net/xircon/xenon/client/io/Log.java index 51684d0..31a7444 100644 --- a/client/src/main/java/net/xircon/xenon/client/io/Log.java +++ b/client/src/main/java/net/xircon/xenon/client/io/Log.java @@ -2,7 +2,6 @@ package net.xircon.xenon.client.io; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.core.Appender; import javax.swing.*; diff --git a/client/src/main/java/net/xircon/xenon/client/networking/Networking.java b/client/src/main/java/net/xircon/xenon/client/networking/Networking.java index cfa3ac5..e27123e 100644 --- a/client/src/main/java/net/xircon/xenon/client/networking/Networking.java +++ b/client/src/main/java/net/xircon/xenon/client/networking/Networking.java @@ -2,18 +2,18 @@ package net.xircon.xenon.client.networking; import net.xircon.xenon.client.io.Log; -import javax.annotation.Nullable; import java.io.IOException; -import java.net.InetSocketAddress; import java.net.Socket; -import java.net.SocketAddress; -import java.net.SocketTimeoutException; public class Networking { public static final String NAME_TERMINATOR = "\uffff"; public static final String MESSAGE_TERMINATOR = "\ufffe"; + public static final String SERVER_ID_START = "\ufff0"; + public static final String SERVER_ID_END = "\ufff1"; + public static final String SEVER_CONNECTION = "\ufff2"; public static int PortVoIP = 49190; public static int PortText = 49180; + public static String ServerName = ""; public static void disconnectFromServer(Socket socket) { try { diff --git a/client/src/main/java/net/xircon/xenon/client/networking/textclient/TextClient.java b/client/src/main/java/net/xircon/xenon/client/networking/textclient/TextClient.java index bbff71c..40b9ab5 100644 --- a/client/src/main/java/net/xircon/xenon/client/networking/textclient/TextClient.java +++ b/client/src/main/java/net/xircon/xenon/client/networking/textclient/TextClient.java @@ -1,9 +1,12 @@ package net.xircon.xenon.client.networking.textclient; +import net.xircon.xenon.client.Xenon; import net.xircon.xenon.client.io.Log; import net.xircon.xenon.client.networking.Networking; import javax.annotation.Nullable; +import javax.swing.*; +import java.awt.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -14,9 +17,9 @@ import java.net.SocketAddress; import java.net.SocketTimeoutException; public class TextClient implements Runnable { - private String nickname; + private final String nickname; public static String messageBuffer = ""; - private String address; + private final String address; public static Socket socket; public TextClient(String address, String nickname) { @@ -28,27 +31,40 @@ public class TextClient implements Runnable { try { socket = connectToServer(address, Networking.PortText); assert socket != null; + // Input From Server + new Thread(() -> { + try { + BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); + String serverMessage; + while ((serverMessage = input.readLine()) != null) { + if (serverMessage.startsWith(Networking.SERVER_ID_START) && serverMessage.endsWith(Networking.SERVER_ID_END)) { + Log.info("Server Message: " + serverMessage); + String serverName = serverMessage.substring(1, serverMessage.length() - 1); + SwingUtilities.invokeLater(() -> { + Xenon.serverName.setText(serverName); + Xenon.serverName.setForeground(new Color(0, 129, 0)); + }); + } + Thread.sleep(500); + Log.info("Server Message: " + serverMessage); + } + } catch (IOException | InterruptedException e) { + Log.warn("Could not Read Data!"); + } + }); -// BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); -// PrintWriter output = new PrintWriter(socket.getOutputStream(), true); -// output.println(nickname + Networking.NAME_TERMINATOR + messageBuffer + Networking.MESSAGE_TERMINATOR); -// String messageFromServer = input.readLine(); -// Log.info("Server Message: " + messageFromServer); PrintWriter output = new PrintWriter(socket.getOutputStream(), true); - BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); while(socket.isConnected()) { if (!messageBuffer.isEmpty()) { output.println(nickname + Networking.NAME_TERMINATOR + messageBuffer + Networking.MESSAGE_TERMINATOR); Log.info("Sending! " + nickname + Networking.NAME_TERMINATOR + messageBuffer + Networking.MESSAGE_TERMINATOR); - messageBuffer = new String(); - String messageFromServer = input.readLine(); - Log.info("Server Message: " + messageFromServer); + messageBuffer = ""; } else { Thread.sleep(500); } } } catch (IOException | InterruptedException e) { - Log.warn("Could not Read/Send Data!"); + Log.warn("Could not Send Data!"); } } diff --git a/server/src/main/java/net/xircon/xenon/server/Xenon.java b/server/src/main/java/net/xircon/xenon/server/Xenon.java index e28bae4..da5cf09 100644 --- a/server/src/main/java/net/xircon/xenon/server/Xenon.java +++ b/server/src/main/java/net/xircon/xenon/server/Xenon.java @@ -13,7 +13,6 @@ import static net.xircon.xenon.server.networking.Networking.*; //import java.net. public class Xenon implements Runnable { - private Thread serverThread; public static void main(String[] args) {new Xenon().start();} private static final String propertiesFile = "server.properties"; @@ -21,7 +20,7 @@ public class Xenon implements Runnable { public void start() { - serverThread = new Thread(this, "serverThread"); + Thread serverThread = new Thread(this, "serverThread"); serverThread.start(); } diff --git a/server/src/main/java/net/xircon/xenon/server/networking/Networking.java b/server/src/main/java/net/xircon/xenon/server/networking/Networking.java index ee725ae..88eeb9c 100644 --- a/server/src/main/java/net/xircon/xenon/server/networking/Networking.java +++ b/server/src/main/java/net/xircon/xenon/server/networking/Networking.java @@ -2,6 +2,9 @@ package net.xircon.xenon.server.networking; public class Networking { public static String ServerName = "Xenon Test Server"; + public static final String SERVER_ID_START = "\ufff0"; + public static final String SERVER_ID_END = "\ufff1"; + public static final String SEVER_CONNECTION = "\ufff2"; public static int PortVoIP = 49190; public static int PortText = 49180; } diff --git a/server/src/main/java/net/xircon/xenon/server/networking/textserver/ClientHandler.java b/server/src/main/java/net/xircon/xenon/server/networking/textserver/ClientHandler.java index f738fac..64c8792 100644 --- a/server/src/main/java/net/xircon/xenon/server/networking/textserver/ClientHandler.java +++ b/server/src/main/java/net/xircon/xenon/server/networking/textserver/ClientHandler.java @@ -2,6 +2,7 @@ package net.xircon.xenon.server.networking.textserver; import net.xircon.xenon.server.io.Log; import net.xircon.xenon.server.io.database.Database; +import net.xircon.xenon.server.networking.Networking; import java.io.BufferedReader; import java.io.IOException; @@ -18,18 +19,27 @@ public class ClientHandler implements Runnable { @Override public void run() { - while (clientSocket.isConnected()) try { + boolean sentServername = false; + while (clientSocket.isConnected() && !clientSocket.isClosed()) try { BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter output = new PrintWriter(clientSocket.getOutputStream(), true); + clientSocket.setKeepAlive(true); + if (!sentServername) { + Log.info("Sending Server Info to Client"); + output.println(Networking.SERVER_ID_START + Networking.ServerName + Networking.SERVER_ID_END); + sentServername = true; + } String message = input.readLine(); String[] namedMessage = message.split(Database.NAME_TERMINATOR, -1); Log.info("<" + namedMessage[0] + "> " + namedMessage[1]); Database.write(message); - output.println("Server Received Message!"); - clientSocket.setKeepAlive(true); - } catch (IOException e) { - Log.warn("Could not Read Message From Client"); + Log.warn("Could not Read Message From Client, Closing Connection"); + try { + clientSocket.close(); + } catch (IOException ex) { + Log.err("Failed to Close Client Socket"); + } } } }