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<ClientHandler> 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) {