Creating an Asynchronous Multithreaded chat Application in Java - GeeksforGeeks

01 Apr, 2019
Prerequisite: Datagrams in Java
In this article, we will learn how to use Datagrams in Java to create an Asynchronous messaging application in java. Asynchronous in this context means that both the server and the client can send each other texts independently without waiting for any kind of response from the other party. We will be using the concept of multi-threading to implement Sending and receiving text messages between the processes with the help of DatagramPackets. Datagrams are bundles of information passed between applications. Once the datagram has been released to its intended target, it is independent and there is no assurance that it will arrive or even that some application will be there to receive it. Java implements datagrams on top of the UDP (User Datagram Protocol) protocol.
Below is the implementation of the above approach.
UnsyncChatServer.java
UnsyncChatClient.java
import java.net.*;import java.io.*;import java.util.*;  public class UnSyncChatServer {      public static void main(String args[])        throws IOException, InterruptedException    {          // Create DatagramSocket and get ip        DatagramSocket ss = new DatagramSocket(1234);        InetAddress ip = InetAddress.getLocalHost();          System.out.println("Running UnSyncChatServer.java");          System.out.println("Server is Up....");          // Create a sender thread        // with a nested runnable class definition        Thread ssend;        ssend = new Thread(new Runnable() {            @Override            public void run()            {                try {                    Scanner sc = new Scanner(System.in);                    while (true) {                        synchronized (this)                        {                            byte[] sd = new byte[1000];                              // scan new message to send                            sd = sc.nextLine().getBytes();                            DatagramPacket sp                                = new DatagramPacket(                                    sd,                                    sd.length,                                    ip,                                    5334);                              // send the new packet                            ss.send(sp);                              String msg = new String(sd);                            System.out.println("Server says: "                                               + msg);                              // exit condition                            if ((msg).equals("bye")) {                                System.out.println("Server"                                                   + " exiting... ");                                break;                            }                            System.out.println("Waiting for"                                               + " client response... ");                        }                    }                }                catch (Exception e) {                    System.out.println("Exception occured");                }            }        });          Thread sreceive;        sreceive = new Thread(new Runnable() {            @Override            public void run()            {                try {                    while (true) {                        synchronized (this)                        {                              byte[] rd = new byte[1000];                              // Receive new message                            DatagramPacket sp1                                = new DatagramPacket(                                    rd,                                    rd.length);                            ss.receive(sp1);                              // Convert byte data to string                            String msg                                = (new String(rd)).trim();                            System.out.println("Client ("                                               + sp1.getPort()                                               + "):"                                               + " "                                               + msg);                              // Exit condition                            if (msg.equals("bye")) {                                System.out.println("Client"                                                   + " connection closed.");                                break;                            }                        }                    }                }                catch (Exception e) {                    System.out.println("Exception occured");                }            }        });          ssend.start();        sreceive.start();          ssend.join();        sreceive.join();    }}
import java.io.*;import java.net.*;import java.util.Scanner;  public class UnSyncChatClient {      public static void main(String args[])        throws IOException, InterruptedException    {          // create DatagramSocket and get ip        DatagramSocket cs            = new DatagramSocket(5334);        InetAddress ip            = InetAddress.getLocalHost();          System.out.println("Running UnSyncChatClient.java");          System.out.println("Client is Up....");          // create a sender thread with a nested        // runnable class definition        Thread csend;        csend = new Thread(new Runnable() {            @Override            public void run()            {                try {                    Scanner sc = new Scanner(System.in);                    while (true) {                        synchronized (this)                        {                            byte[] sd = new byte[1000];                              // scan new message to send                            sd = sc.nextLine().getBytes();                              // create datagram packet                            // for new message                            DatagramPacket sp                                = new DatagramPacket(                                    sd,                                    sd.length,                                    ip,                                    1234);                              // send the new packet                            cs.send(sp);                              String msg = new String(sd);                            System.out.println("Client says: "                                               + msg);                            // exit condition                            if (msg.equals("bye")) {                                System.out.println("client "                                                   + "exiting... ");                                break;                            }                            System.out.println("Waiting for "                                               + "server response...");                        }                    }                }                catch (IOException e) {                    System.out.println("Exception occured");                }            }        });          // create a receiver thread with a nested        // runnable class definition        Thread creceive;        creceive = new Thread(new Runnable() {            @Override            public void run()            {                try {                      while (true) {                        synchronized (this)                        {                              byte[] rd = new byte[1000];                              // receive new message                            DatagramPacket sp1                                = new DatagramPacket(                                    rd,                                    rd.length);                            cs.receive(sp1);                              // convert byte data to string                            String msg = (new String(rd)).trim();                            System.out.println("Server: " + msg);                              // exit condition                            if (msg.equals("bye")) {                                System.out.println("Server"                                                   + " Stopped....");                                break;                            }                        }                    }                }                catch (IOException e) {                    System.out.println("Exception occured");                }            }        });          csend.start();        creceive.start();          csend.join();        creceive.join();    }}
Output: Window 1 (UnSyncChatServer.java)
Running UnSyncChatServer.java
Server is Up....
Client (5334): hey
hi
Server says: hi
Waiting for client response... 
ssup?
Server says: ssup?
Waiting for client response... 
Client (5334): good
Client (5334): u?
good as well
Server says: good as well
Waiting for client response... 
Client (5334): bye
Client connection closed.
bye
Server says: bye
Server exiting... 

Output: Window 2 (UnSyncChatClient.java)
Running UnSyncChatClient.java
Client is Up....
hey
Client says: hey
Waiting for server response...
Server: hi
Server: ssup?
good
Client says: good
Waiting for server response...
u?
Client says: u?
Waiting for server response...
Server: good as well
bye
Client says: bye
client exiting... 
Server: bye
Server Stopped...

Note:
Use an offline IDE to run this program as an online IDE may timeout.
Run program 1 first and the program 2.
Java-Multithreading
Computer Networks
Java
Java Programs
Java
Computer Networks
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Advanced Encryption Standard (AES)
Intrusion Detection System (IDS)
Multiple Access Protocols in Computer Network
GSM in Wireless Communication
Cryptography and its Types
Arrays in Java
Split() String method in Java with examples
For-each loop in Java
Arrays.sort() in Java with examples
Reverse a string in Java