diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1da6ad9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +``` +# Compiled Java classes +*.class + +# Build directory +bin/ +``` \ No newline at end of file diff --git a/bin/TCP/TCPClient.class b/bin/TCP/TCPClient.class index 1af547e..194184d 100644 Binary files a/bin/TCP/TCPClient.class and b/bin/TCP/TCPClient.class differ diff --git a/bin/TCP/TCPServer.class b/bin/TCP/TCPServer.class index 130e843..ac85b1d 100644 Binary files a/bin/TCP/TCPServer.class and b/bin/TCP/TCPServer.class differ diff --git a/bin/UDP/UDPClient.class b/bin/UDP/UDPClient.class index f92aa13..3e20c6f 100644 Binary files a/bin/UDP/UDPClient.class and b/bin/UDP/UDPClient.class differ diff --git a/bin/UDP/UDPServer.class b/bin/UDP/UDPServer.class index 141e909..ed27e35 100644 Binary files a/bin/UDP/UDPServer.class and b/bin/UDP/UDPServer.class differ diff --git a/src/TCP/TCPClientGUI.java b/src/TCP/TCPClientGUI.java new file mode 100644 index 0000000..8e5d2d2 --- /dev/null +++ b/src/TCP/TCPClientGUI.java @@ -0,0 +1,163 @@ +package TCP; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import java.net.*; + +public class TCPClientGUI extends JFrame { + private JTextField hostField; + private JSpinner portSpinner; + private JTextArea messageArea; + private JTextField inputField; + private JButton connectButton; + private JButton sendButton; + private Socket socket; + private PrintWriter out; + private BufferedReader in; + private boolean connected = false; + + public TCPClientGUI() { + super("TCP Client GUI"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(600, 500); + setLocationRelativeTo(null); + + // Create components + JPanel topPanel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(5, 5, 5, 5); + gbc.anchor = GridBagConstraints.WEST; + + topPanel.add(new JLabel("Host:"), gbc); + gbc.gridx = 1; + gbc.weightx = 1.0; + gbc.fill = GridBagConstraints.HORIZONTAL; + hostField = new JTextField("localhost", 15); + topPanel.add(hostField, gbc); + + gbc.gridx = 2; + gbc.weightx = 0; + gbc.fill = GridBagConstraints.NONE; + topPanel.add(new JLabel("Port:"), gbc); + gbc.gridx = 3; + portSpinner = new JSpinner(new SpinnerNumberModel(5000, 1, 65535, 1)); + topPanel.add(portSpinner, gbc); + + gbc.gridx = 4; + connectButton = new JButton("Connect"); + connectButton.addActionListener(e -> toggleConnection()); + topPanel.add(connectButton, gbc); + + // Message display area + messageArea = new JTextArea(); + messageArea.setEditable(false); + messageArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); + JScrollPane scrollPane = new JScrollPane(messageArea); + scrollPane.setPreferredSize(new Dimension(0, 300)); + + // Input panel + JPanel inputPanel = new JPanel(new BorderLayout()); + inputField = new JTextField(); + inputField.setEnabled(false); + inputField.addActionListener(e -> sendMessage()); + sendButton = new JButton("Send"); + sendButton.setEnabled(false); + sendButton.addActionListener(e -> sendMessage()); + + inputPanel.add(inputField, BorderLayout.CENTER); + inputPanel.add(sendButton, BorderLayout.EAST); + + // Layout + setLayout(new BorderLayout()); + add(topPanel, BorderLayout.NORTH); + add(scrollPane, BorderLayout.CENTER); + add(inputPanel, BorderLayout.SOUTH); + + setVisible(true); + } + + private void toggleConnection() { + if (!connected) { + connect(); + } else { + disconnect(); + } + } + + private void connect() { + String host = hostField.getText().trim(); + int port = (Integer) portSpinner.getValue(); + + try { + socket = new Socket(host, port); + out = new PrintWriter(socket.getOutputStream(), true); + in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + + connected = true; + connectButton.setText("Disconnect"); + inputField.setEnabled(true); + sendButton.setEnabled(true); + hostField.setEnabled(false); + portSpinner.setEnabled(false); + messageArea.append("Connected to server at " + host + ":" + port + "\n"); + + // Start reader thread + new Thread(this::readFromServer).start(); + + } catch (IOException e) { + JOptionPane.showMessageDialog(this, "Failed to connect: " + e.getMessage(), + "Connection Error", JOptionPane.ERROR_MESSAGE); + disconnect(); + } + } + + private void disconnect() { + connected = false; + connectButton.setText("Connect"); + inputField.setEnabled(false); + sendButton.setEnabled(false); + hostField.setEnabled(true); + portSpinner.setEnabled(true); + messageArea.append("Disconnected from server\n"); + + try { + if (socket != null && !socket.isClosed()) { + socket.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void readFromServer() { + String line; + try { + while (connected && (line = in.readLine()) != null) { + String finalLine = line; + SwingUtilities.invokeLater(() -> messageArea.append("Server: " + finalLine + "\n")); + } + } catch (IOException e) { + if (connected) { + SwingUtilities.invokeLater(() -> { + messageArea.append("Connection lost: " + e.getMessage() + "\n"); + disconnect(); + }); + } + } + } + + private void sendMessage() { + String message = inputField.getText().trim(); + if (!message.isEmpty() && connected) { + out.println(message); + messageArea.append("You: " + message + "\n"); + inputField.setText(""); + } + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(TCPClientGUI::new); + } +} diff --git a/src/TCP/TCPServerGUI.java b/src/TCP/TCPServerGUI.java new file mode 100644 index 0000000..405b02f --- /dev/null +++ b/src/TCP/TCPServerGUI.java @@ -0,0 +1,133 @@ +package TCP; + +import javax.swing.*; +import java.awt.*; +import java.io.*; +import java.net.*; +import java.util.concurrent.atomic.AtomicBoolean; + +public class TCPServerGUI extends JFrame { + private JSpinner portSpinner; + private JButton startButton; + private JTextArea logArea; + private ServerSocket serverSocket; + private AtomicBoolean running = new AtomicBoolean(false); + + public TCPServerGUI() { + super("TCP Server GUI"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(600, 500); + setLocationRelativeTo(null); + + // Top panel with port and start button + JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + topPanel.add(new JLabel("Port:")); + portSpinner = new JSpinner(new SpinnerNumberModel(5000, 1, 65535, 1)); + topPanel.add(portSpinner); + startButton = new JButton("Start Server"); + startButton.addActionListener(e -> toggleServer()); + topPanel.add(startButton); + + // Log area + logArea = new JTextArea(); + logArea.setEditable(false); + logArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); + JScrollPane scrollPane = new JScrollPane(logArea); + + // Layout + setLayout(new BorderLayout()); + add(topPanel, BorderLayout.NORTH); + add(scrollPane, BorderLayout.CENTER); + + setVisible(true); + } + + private void toggleServer() { + if (!running.get()) { + startServer(); + } else { + stopServer(); + } + } + + private void startServer() { + int port = (Integer) portSpinner.getValue(); + try { + serverSocket = new ServerSocket(port); + running.set(true); + startButton.setText("Stop Server"); + portSpinner.setEnabled(false); + logArea.append("TCP Server started on port " + port + "\n"); + + // Accept clients in a separate thread + new Thread(this::acceptClients).start(); + + } catch (IOException e) { + JOptionPane.showMessageDialog(this, "Failed to start server: " + e.getMessage(), + "Server Error", JOptionPane.ERROR_MESSAGE); + stopServer(); + } + } + + private void acceptClients() { + while (running.get()) { + try { + Socket clientSocket = serverSocket.accept(); + logArea.append("Client connected: " + clientSocket.getInetAddress() + "\n"); + + // Handle each client in a separate thread + new Thread(() -> handleClient(clientSocket)).start(); + + } catch (IOException e) { + if (running.get()) { + logArea.append("Error accepting client: " + e.getMessage() + "\n"); + } + } + } + } + + private void handleClient(Socket clientSocket) { + try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) { + + String message; + while ((message = in.readLine()) != null) { + String finalMessage = message; + SwingUtilities.invokeLater(() -> + logArea.append("Received from " + clientSocket.getInetAddress() + ": " + finalMessage + "\n")); + + String response = "Echo: " + message; + out.println(response); + } + + } catch (IOException e) { + SwingUtilities.invokeLater(() -> + logArea.append("Client disconnected: " + clientSocket.getInetAddress() + "\n")); + } finally { + try { + clientSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private void stopServer() { + running.set(false); + startButton.setText("Start Server"); + portSpinner.setEnabled(true); + logArea.append("TCP Server stopped\n"); + + try { + if (serverSocket != null && !serverSocket.isClosed()) { + serverSocket.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(TCPServerGUI::new); + } +} diff --git a/src/UDP/UDPClientGUI.java b/src/UDP/UDPClientGUI.java new file mode 100644 index 0000000..8bb0af7 --- /dev/null +++ b/src/UDP/UDPClientGUI.java @@ -0,0 +1,172 @@ +package UDP; + +import javax.swing.*; +import java.awt.*; +import java.io.IOException; +import java.net.*; + +public class UDPClientGUI extends JFrame { + private JTextField hostField; + private JSpinner portSpinner; + private JTextArea messageArea; + private JTextField inputField; + private JButton connectButton; + private JButton sendButton; + private DatagramSocket socket; + private InetAddress address; + private boolean connected = false; + private int port; + private String host; + + public UDPClientGUI() { + super("UDP Client GUI"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(600, 500); + setLocationRelativeTo(null); + + // Create components + JPanel topPanel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(5, 5, 5, 5); + gbc.anchor = GridBagConstraints.WEST; + + topPanel.add(new JLabel("Host:"), gbc); + gbc.gridx = 1; + gbc.weightx = 1.0; + gbc.fill = GridBagConstraints.HORIZONTAL; + hostField = new JTextField("localhost", 15); + topPanel.add(hostField, gbc); + + gbc.gridx = 2; + gbc.weightx = 0; + gbc.fill = GridBagConstraints.NONE; + topPanel.add(new JLabel("Port:"), gbc); + gbc.gridx = 3; + portSpinner = new JSpinner(new SpinnerNumberModel(6000, 1, 65535, 1)); + topPanel.add(portSpinner, gbc); + + gbc.gridx = 4; + connectButton = new JButton("Connect"); + connectButton.addActionListener(e -> toggleConnection()); + topPanel.add(connectButton, gbc); + + // Message display area + messageArea = new JTextArea(); + messageArea.setEditable(false); + messageArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); + JScrollPane scrollPane = new JScrollPane(messageArea); + scrollPane.setPreferredSize(new Dimension(0, 300)); + + // Input panel + JPanel inputPanel = new JPanel(new BorderLayout()); + inputField = new JTextField(); + inputField.setEnabled(false); + inputField.addActionListener(e -> sendMessage()); + sendButton = new JButton("Send"); + sendButton.setEnabled(false); + sendButton.addActionListener(e -> sendMessage()); + + inputPanel.add(inputField, BorderLayout.CENTER); + inputPanel.add(sendButton, BorderLayout.EAST); + + // Layout + setLayout(new BorderLayout()); + add(topPanel, BorderLayout.NORTH); + add(scrollPane, BorderLayout.CENTER); + add(inputPanel, BorderLayout.SOUTH); + + setVisible(true); + } + + private void toggleConnection() { + if (!connected) { + connect(); + } else { + disconnect(); + } + } + + private void connect() { + host = hostField.getText().trim(); + port = (Integer) portSpinner.getValue(); + + try { + address = InetAddress.getByName(host); + socket = new DatagramSocket(); + socket.setSoTimeout(5000); // 5 second timeout for receiving + + connected = true; + connectButton.setText("Disconnect"); + inputField.setEnabled(true); + sendButton.setEnabled(true); + hostField.setEnabled(false); + portSpinner.setEnabled(false); + messageArea.append("Connected to UDP server at " + host + ":" + port + "\n"); + + // Start reader thread + new Thread(this::readFromServer).start(); + + } catch (UnknownHostException e) { + JOptionPane.showMessageDialog(this, "Unknown host: " + host, + "Connection Error", JOptionPane.ERROR_MESSAGE); + } catch (SocketException e) { + JOptionPane.showMessageDialog(this, "Failed to create socket: " + e.getMessage(), + "Connection Error", JOptionPane.ERROR_MESSAGE); + } + } + + private void disconnect() { + connected = false; + connectButton.setText("Connect"); + inputField.setEnabled(false); + sendButton.setEnabled(false); + hostField.setEnabled(true); + portSpinner.setEnabled(true); + messageArea.append("Disconnected from server\n"); + + if (socket != null && !socket.isClosed()) { + socket.close(); + } + } + + private void readFromServer() { + byte[] buffer = new byte[1024]; + while (connected) { + try { + DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length); + socket.receive(receivePacket); + String response = new String(receivePacket.getData(), 0, receivePacket.getLength()); + SwingUtilities.invokeLater(() -> messageArea.append("Server: " + response + "\n")); + } catch (SocketTimeoutException e) { + // Timeout is expected, just continue listening + } catch (IOException e) { + if (connected) { + SwingUtilities.invokeLater(() -> { + messageArea.append("Error receiving: " + e.getMessage() + "\n"); + disconnect(); + }); + } + } + } + } + + private void sendMessage() { + String message = inputField.getText().trim(); + if (!message.isEmpty() && connected) { + try { + byte[] data = message.getBytes(); + DatagramPacket sendPacket = new DatagramPacket(data, data.length, address, port); + socket.send(sendPacket); + messageArea.append("You: " + message + "\n"); + inputField.setText(""); + } catch (IOException e) { + JOptionPane.showMessageDialog(this, "Failed to send: " + e.getMessage(), + "Send Error", JOptionPane.ERROR_MESSAGE); + } + } + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(UDPClientGUI::new); + } +} diff --git a/src/UDP/UDPServerGUI.java b/src/UDP/UDPServerGUI.java new file mode 100644 index 0000000..96c43bd --- /dev/null +++ b/src/UDP/UDPServerGUI.java @@ -0,0 +1,120 @@ +package UDP; + +import javax.swing.*; +import java.awt.*; +import java.io.IOException; +import java.net.*; +import java.util.concurrent.atomic.AtomicBoolean; + +public class UDPServerGUI extends JFrame { + private JSpinner portSpinner; + private JButton startButton; + private JTextArea logArea; + private DatagramSocket socket; + private AtomicBoolean running = new AtomicBoolean(false); + + public UDPServerGUI() { + super("UDP Server GUI"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(600, 500); + setLocationRelativeTo(null); + + // Top panel with port and start button + JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + topPanel.add(new JLabel("Port:")); + portSpinner = new JSpinner(new SpinnerNumberModel(6000, 1, 65535, 1)); + topPanel.add(portSpinner); + startButton = new JButton("Start Server"); + startButton.addActionListener(e -> toggleServer()); + topPanel.add(startButton); + + // Log area + logArea = new JTextArea(); + logArea.setEditable(false); + logArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); + JScrollPane scrollPane = new JScrollPane(logArea); + + // Layout + setLayout(new BorderLayout()); + add(topPanel, BorderLayout.NORTH); + add(scrollPane, BorderLayout.CENTER); + + setVisible(true); + } + + private void toggleServer() { + if (!running.get()) { + startServer(); + } else { + stopServer(); + } + } + + private void startServer() { + int port = (Integer) portSpinner.getValue(); + try { + socket = new DatagramSocket(port); + running.set(true); + startButton.setText("Stop Server"); + portSpinner.setEnabled(false); + logArea.append("UDP Server started on port " + port + "\n"); + + // Listen for packets in a separate thread + new Thread(this::listenForPackets).start(); + + } catch (SocketException e) { + JOptionPane.showMessageDialog(this, "Failed to start server: " + e.getMessage(), + "Server Error", JOptionPane.ERROR_MESSAGE); + stopServer(); + } + } + + private void listenForPackets() { + byte[] buffer = new byte[1024]; + while (running.get()) { + try { + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + socket.receive(packet); // blocks until packet arrives + + String received = new String(packet.getData(), 0, packet.getLength()); + InetAddress clientAddress = packet.getAddress(); + int clientPort = packet.getPort(); + + SwingUtilities.invokeLater(() -> + logArea.append("Received from " + clientAddress + ":" + clientPort + ": " + received + "\n")); + + // Send response back to sender + String response = "Echo: " + received; + byte[] responseData = response.getBytes(); + DatagramPacket responsePacket = new DatagramPacket( + responseData, responseData.length, + clientAddress, clientPort); + socket.send(responsePacket); + + SwingUtilities.invokeLater(() -> + logArea.append("Sent echo to " + clientAddress + ":" + clientPort + "\n")); + + } catch (IOException e) { + if (running.get()) { + SwingUtilities.invokeLater(() -> + logArea.append("Error: " + e.getMessage() + "\n")); + } + } + } + } + + private void stopServer() { + running.set(false); + startButton.setText("Start Server"); + portSpinner.setEnabled(true); + logArea.append("UDP Server stopped\n"); + + if (socket != null && !socket.isClosed()) { + socket.close(); + } + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(UDPServerGUI::new); + } +}