From ae672bf4e73bf06ae67e73fc09a658cda72f70dd Mon Sep 17 00:00:00 2001 From: Guilherme Werner Date: Thu, 15 Jun 2023 14:11:59 -0300 Subject: [PATCH] Add udp and tcp listeners --- src/main/java/org/example/ClientApp.java | 73 +++++++++++++---- src/main/java/org/example/ServerApp.java | 99 ++++++++++++++++++++---- 2 files changed, 142 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/example/ClientApp.java b/src/main/java/org/example/ClientApp.java index 20cced0..3fe8373 100644 --- a/src/main/java/org/example/ClientApp.java +++ b/src/main/java/org/example/ClientApp.java @@ -8,17 +8,21 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; +import java.net.DatagramPacket; +import java.net.DatagramSocket; import java.net.Socket; public class ClientApp extends JFrame { private static final String SERVER_IP = "localhost"; - private static final int SERVER_PORT = 1234; + private static final int SERVER_TCP_PORT = 1234; + private static final int SERVER_UDP_PORT = 5678; private JTextArea chatArea; private JTextField messageField; private JButton sendButton; - private Socket socket; + private Socket tcpSocket; + private DatagramSocket udpSocket; private BufferedReader in; private PrintWriter out; private String clientName; @@ -55,21 +59,23 @@ public class ClientApp extends JFrame { setVisible(true); connectToServer(); - startListening(); + startTCPListening(); + startUDPListening(); } private void connectToServer() { try { - socket = new Socket(SERVER_IP, SERVER_PORT); - in = new BufferedReader(new InputStreamReader(socket.getInputStream())); - out = new PrintWriter(socket.getOutputStream(), true); + tcpSocket = new Socket(SERVER_IP, SERVER_TCP_PORT); + udpSocket = new DatagramSocket(); + in = new BufferedReader(new InputStreamReader(tcpSocket.getInputStream())); + out = new PrintWriter(tcpSocket.getOutputStream(), true); chatArea.append("Connected to server\n"); } catch (IOException e) { e.printStackTrace(); } } - private void startListening() { + private void startTCPListening() { Thread thread = new Thread(new Runnable() { @Override public void run() { @@ -84,7 +90,7 @@ public class ClientApp extends JFrame { try { in.close(); out.close(); - socket.close(); + tcpSocket.close(); } catch (IOException e) { e.printStackTrace(); } @@ -94,21 +100,60 @@ public class ClientApp extends JFrame { thread.start(); } + private void startUDPListening() { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + byte[] buffer = new byte[1024]; + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + + while (true) { + udpSocket.receive(packet); + String message = new String(packet.getData(), 0, packet.getLength()); + chatArea.append(message + "\n"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + udpSocket.close(); + } + } + }); + thread.start(); + } + private void sendMessage() { String message = messageField.getText().trim(); if (!message.isEmpty()) { out.println(clientName + ": " + message); + //sendUDPMessage(clientName + ": " + message); messageField.setText(""); chatArea.append("You: " + message + "\n"); } } + private void sendUDPMessage(String message) { + try { + byte[] buffer = message.getBytes(); + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, tcpSocket.getInetAddress(), + SERVER_UDP_PORT); + udpSocket.send(packet); + } catch (IOException e) { + e.printStackTrace(); + } + } + public static void main(String[] args) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - new ClientApp(args[0]); - } - }); + if (args.length > 0) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + new ClientApp(args[0]); + } + }); + } else { + System.out.println("Please provide a client name as an argument."); + } } } diff --git a/src/main/java/org/example/ServerApp.java b/src/main/java/org/example/ServerApp.java index 801dfb9..e49fdf3 100644 --- a/src/main/java/org/example/ServerApp.java +++ b/src/main/java/org/example/ServerApp.java @@ -4,13 +4,16 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; +import java.net.DatagramPacket; +import java.net.DatagramSocket; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class ServerApp { - private static final int PORT = 1234; + private static final int TCP_PORT = 1234; + private static final int UDP_PORT = 5678; private List clients; public ServerApp() { @@ -19,36 +22,88 @@ public class ServerApp { public void start() { try { - ServerSocket serverSocket = new ServerSocket(PORT); - System.out.println("Server started on port " + PORT); - - while (true) { - Socket clientSocket = serverSocket.accept(); - System.out.println("New client connected: " + clientSocket); - - ClientHandler clientHandler = new ClientHandler(clientSocket); - clients.add(clientHandler); - clientHandler.start(); - } + ServerSocket serverSocket = new ServerSocket(TCP_PORT); + DatagramSocket datagramSocket = new DatagramSocket(UDP_PORT); + System.out.println("Server started on TCP port " + TCP_PORT + " and UDP port " + UDP_PORT); + TCPListener tcpListener = new TCPListener(serverSocket); + UDPListener udpListener = new UDPListener(datagramSocket); + tcpListener.start(); + udpListener.start(); } catch (IOException e) { e.printStackTrace(); } } - private void broadcastMessage(String message, ClientHandler sender) { + private void broadcastTCPMessage(String message, ClientHandler sender) { for (ClientHandler client : clients) { if (client != sender) { - client.sendMessage(message); + client.sendTCPMessage(message); } } } + private void broadcastUDPMessage(String message) { + for (ClientHandler client : clients) { + client.sendUDPMessage(message); + } + } + private void removeClient(ClientHandler client) { clients.remove(client); } + private class TCPListener extends Thread { + private ServerSocket serverSocket; + + public TCPListener(ServerSocket serverSocket) { + this.serverSocket = serverSocket; + } + + @Override + public void run() { + while (true) { + try { + Socket clientSocket = serverSocket.accept(); + System.out.println("New client connected: " + clientSocket); + ClientHandler clientHandler = new ClientHandler(clientSocket); + clients.add(clientHandler); + clientHandler.start(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + private class UDPListener extends Thread { + private DatagramSocket datagramSocket; + + public UDPListener(DatagramSocket datagramSocket) { + this.datagramSocket = datagramSocket; + } + + @Override + public void run() { + try { + byte[] buffer = new byte[1024]; + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + + while (true) { + datagramSocket.receive(packet); + String message = new String(packet.getData(), 0, packet.getLength()); + broadcastTCPMessage(message, null); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + datagramSocket.close(); + } + } + } + private class ClientHandler extends Thread { private Socket clientSocket; + private DatagramSocket datagramSocket; private BufferedReader in; private PrintWriter out; @@ -61,9 +116,11 @@ public class ServerApp { try { in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); out = new PrintWriter(clientSocket.getOutputStream(), true); + datagramSocket = new DatagramSocket(); + String clientMessage; while ((clientMessage = in.readLine()) != null) { - broadcastMessage(clientMessage, this); + broadcastTCPMessage(clientMessage, this); } } catch (IOException e) { e.printStackTrace(); @@ -79,9 +136,19 @@ public class ServerApp { } } - public void sendMessage(String message) { + public void sendTCPMessage(String message) { out.println(message); } + + public void sendUDPMessage(String message) { + try { + byte[] buffer = message.getBytes(); + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, clientSocket.getInetAddress(), UDP_PORT); + datagramSocket.send(packet); + } catch (IOException e) { + e.printStackTrace(); + } + } } public static void main(String[] args) {