In this tutorial, you’ll learn how to build a Java chat Application system using Java sockets.
This project is perfect for college, this project will teach you the concept of client-server communication in Java Chat App.
Let’s Create this 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); } }
Conclusion
You’ve now created a basic Java Chat Application that enables message exchange between a client and a server.
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.