In this tutorial, you’ll learn how to build a Java chat Application system using Java sockets.
Perfect for beginners, this project will teach you the basics of client-server communication in Java Chat App.

Let’s start by creating a simple Java Chat Application.
- Open Eclipse and create a new project named
ChatApp
(or any name of your choice). - Inside the project, create a package with the same name:
ChatApp
. - Add two Java files to this package:
Client.java
andServer.java
. - Now, paste the following code into the respective files.
Client Java Code:
package chatapp; import java.io.*; import java.util.*; import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.text.*; import java.net.*; import javax.swing.border.*; public class Client implements ActionListener { JTextField text; static JPanel a1; static Box vertical = Box.createVerticalBox(); static JFrame f = new JFrame(); static DataOutputStream dout; public static JPanel formatLabel(String out) { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); JLabel output = new JLabel("<html><p style=\"width: 150px\">" + out + "</p></html>"); output.setFont(new Font("Tahoma", Font.PLAIN, 16)); output.setBackground(new Color(227, 250, 248)); output.setOpaque(true); output.setBorder(new EmptyBorder(15, 15, 15, 50)); panel.add(output); Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); JLabel time = new JLabel(); time.setText(sdf.format(cal.getTime())); panel.add(time); return panel; } public void actionPerformed(ActionEvent ae) { try { String out = text.getText(); JPanel p2 = formatLabel(out); a1.setLayout(new BorderLayout()); JPanel right = new JPanel(new BorderLayout()); right.add(p2, BorderLayout.LINE_END); vertical.add(right); vertical.add(Box.createVerticalStrut(15)); a1.add(vertical, BorderLayout.PAGE_START); dout.writeUTF(out); text.setText(""); f.repaint(); f.invalidate(); f.validate(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new Client(); try { //object of the class Socket Socket s = new Socket("127.0.0.1", 6001); DataInputStream din = new DataInputStream(s.getInputStream()); dout = new DataOutputStream(s.getOutputStream()); while(true) { a1.setLayout(new BorderLayout()); String msg = din.readUTF(); JPanel panel = formatLabel(msg); JPanel left = new JPanel(new BorderLayout()); left.add(panel, BorderLayout.LINE_START); vertical.add(left); vertical.add(Box.createVerticalStrut(15)); a1.add(vertical, BorderLayout.PAGE_START); f.validate(); } } catch (Exception e) { e.printStackTrace(); } } Client() { f.setLayout(null); JPanel p1 = new JPanel(); p1.setBackground(new Color(37, 147, 211)); p1.setBounds(0, 0, 450, 70); p1.setLayout(null); f.add(p1); ImageIcon i1 = new ImageIcon(ClassLoader.getSystemResource("icons/3.png")); Image i2 = i1.getImage().getScaledInstance(25, 25, Image.SCALE_DEFAULT); ImageIcon i3 = new ImageIcon(i2); JLabel back = new JLabel(i3); back.setBounds(5, 20, 25, 25); p1.add(back); back.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent ae) { System.exit(0); } }); ImageIcon i4 = new ImageIcon(ClassLoader.getSystemResource("")); Image i5 = i4.getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT); ImageIcon i6 = new ImageIcon(i5); JLabel profile = new JLabel(i6); profile.setBounds(40, 10, 50, 50); p1.add(profile); ImageIcon i7 = new ImageIcon(ClassLoader.getSystemResource("images/video.png")); Image i8 = i7.getImage().getScaledInstance(30, 30, Image.SCALE_DEFAULT); ImageIcon i9 = new ImageIcon(i8); JLabel video = new JLabel(i9); video.setBounds(300, 20, 30, 30); p1.add(video); ImageIcon i10 = new ImageIcon(ClassLoader.getSystemResource("images/phone.png")); Image i11 = i10.getImage().getScaledInstance(35, 30, Image.SCALE_DEFAULT); ImageIcon i12 = new ImageIcon(i11); JLabel phone = new JLabel(i12); phone.setBounds(360, 20, 35, 30); p1.add(phone); ImageIcon i13 = new ImageIcon(ClassLoader.getSystemResource("images/3icon.png")); Image i14 = i13.getImage().getScaledInstance(10, 25, Image.SCALE_DEFAULT); ImageIcon i15 = new ImageIcon(i14); JLabel morevert = new JLabel(i15); morevert.setBounds(420, 20, 10, 25); p1.add(morevert); JLabel name = new JLabel("Me"); name.setBounds(110, 15, 100, 18); name.setForeground(Color.WHITE); name.setFont(new Font("SAN_SERIF", Font.BOLD, 18)); p1.add(name); JLabel status = new JLabel("Active"); status.setBounds(110, 35, 100, 18); status.setForeground(Color.WHITE); status.setFont(new Font("SAN_SERIF", Font.BOLD, 14)); p1.add(status); a1 = new JPanel(); a1.setBounds(5, 75, 440, 500); f.add(a1); text = new JTextField(); text.setBounds(5, 575, 310, 40); text.setFont(new Font("SAN_SERIF", Font.PLAIN, 16)); f.add(text); JButton send = new JButton("Send"); send.setBounds(320, 575, 123, 40); send.setBackground(new Color(37, 147, 211)); send.setForeground(Color.WHITE); send.addActionListener(this); send.setFont(new Font("SAN_SERIF", Font.PLAIN, 16)); f.add(send); f.setSize(450, 700); f.setLocation(800, 50); f.setUndecorated(true); f.getContentPane().setBackground(Color.WHITE); f.setVisible(true); } }
Server Java Code
package chatapp; import java.io.*; import java.util.*; import java.text.*; import java.net.*; import javax.swing.*; import java.awt.*; import javax.swing.border.*; import java.awt.event.*; public class Server implements ActionListener { JTextField text; JPanel a1; static Box vertical = Box.createVerticalBox(); static JFrame f = new JFrame(); static DataOutputStream dout; public void actionPerformed(ActionEvent ae) { try { String out = text.getText(); JPanel p2 = formatLabel(out); a1.setLayout(new BorderLayout()); JPanel right = new JPanel(new BorderLayout()); right.add(p2, BorderLayout.LINE_END); vertical.add(right); vertical.add(Box.createVerticalStrut(15)); a1.add(vertical, BorderLayout.PAGE_START); dout.writeUTF(out); text.setText(""); f.repaint(); f.invalidate(); f.validate(); } catch (Exception e) { e.printStackTrace(); } } public static JPanel formatLabel(String out) { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); JLabel output = new JLabel("<html><p style=\"width: 150px\">" + out + "</p></html>"); output.setFont(new Font("Tahoma", Font.PLAIN, 16)); output.setBackground(new Color(37, 211, 102)); output.setOpaque(true); output.setBorder(new EmptyBorder(15, 15, 15, 50)); panel.add(output); Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); JLabel time = new JLabel(); time.setText(sdf.format(cal.getTime())); panel.add(time); return panel; } public static void main(String[] args) { new Server(); try { ServerSocket skt = new ServerSocket(6001); while(true) { Socket s = skt.accept(); DataInputStream din = new DataInputStream(s.getInputStream()); dout = new DataOutputStream(s.getOutputStream()); while(true) { String msg = din.readUTF(); JPanel panel = formatLabel(msg); JPanel left = new JPanel(new BorderLayout()); left.add(panel, BorderLayout.LINE_START); vertical.add(left); f.validate(); } } } catch (Exception e) { e.printStackTrace(); } } Server() { f.setLayout(null); JPanel p1 = new JPanel(); p1.setBackground(new Color(37, 147, 211)); p1.setBounds(0, 0, 450, 70); p1.setLayout(null); f.add(p1); ImageIcon i1 = new ImageIcon(ClassLoader.getSystemResource("images/3.png")); Image i2 = i1.getImage().getScaledInstance(25, 25, Image.SCALE_DEFAULT); ImageIcon i3 = new ImageIcon(i2); JLabel back = new JLabel(i3); back.setBounds(5, 20, 25, 25); p1.add(back); back.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent ae) { System.exit(0); } }); ImageIcon i4 = new ImageIcon(ClassLoader.getSystemResource("")); Image i5 = i4.getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT); ImageIcon i6 = new ImageIcon(i5); JLabel profile = new JLabel(i6); profile.setBounds(40, 10, 50, 50); p1.add(profile); ImageIcon i7 = new ImageIcon(ClassLoader.getSystemResource("images/video.png")); Image i8 = i7.getImage().getScaledInstance(30, 30, Image.SCALE_DEFAULT); ImageIcon i9 = new ImageIcon(i8); JLabel video = new JLabel(i9); video.setBounds(300, 20, 30, 30); p1.add(video); ImageIcon i10 = new ImageIcon(ClassLoader.getSystemResource("images/phone.png")); Image i11 = i10.getImage().getScaledInstance(35, 30, Image.SCALE_DEFAULT); ImageIcon i12 = new ImageIcon(i11); JLabel phone = new JLabel(i12); phone.setBounds(360, 20, 35, 30); p1.add(phone); ImageIcon i13 = new ImageIcon(ClassLoader.getSystemResource("images/3icon.png")); Image i14 = i13.getImage().getScaledInstance(10, 25, Image.SCALE_DEFAULT); ImageIcon i15 = new ImageIcon(i14); JLabel morevert = new JLabel(i15); morevert.setBounds(420, 20, 10, 25); p1.add(morevert); JLabel name = new JLabel("Friend"); name.setBounds(110, 15, 100, 18); name.setForeground(Color.WHITE); name.setFont(new Font("SAN_SERIF", Font.BOLD, 18)); p1.add(name); JLabel status = new JLabel("Active"); status.setBounds(110, 35, 100, 18); status.setForeground(Color.WHITE); status.setFont(new Font("SAN_SERIF", Font.BOLD, 14)); p1.add(status); a1 = new JPanel(); a1.setBounds(5, 75, 440, 500); f.add(a1); text = new JTextField(); text.setBounds(5, 575, 310, 40); text.setFont(new Font("SAN_SERIF", Font.PLAIN, 16)); f.add(text); JButton send = new JButton("Send"); send.setBounds(320, 575, 123, 40); send.setBackground(new Color(37, 147, 211)); send.setForeground(Color.WHITE); send.addActionListener(this); send.setFont(new Font("SAN_SERIF", Font.PLAIN, 16)); f.add(send); f.setSize(450, 700); f.setLocation(200, 50); f.setUndecorated(true); f.getContentPane().setBackground(Color.WHITE); f.setVisible(true); } }
You’ve now created a basic Java Chat Application that enables message exchange between a client and a server. This foundational project is a great way to understand Java networking and socket programming. To level up, consider implementing features like group messaging, user authentication, typing indicators, and media sharing. Keep experimenting, and turn this simple chat into a full-fledged messaging platform!
For more projects, visit here.