Click here to Skip to main content
15,867,835 members
Articles / Programming Languages / Java

A Java Chat Application

Rate me:
Please Sign up or sign in to vote.
4.82/5 (73 votes)
11 Sep 2013CPOL3 min read 589.8K   93.7K   67   131
A chat application which can handle multiple users at the same time.

Sample Image

Introduction

In this article I am demonstrating a chat application which can handle multiple users at the same time. It also supports file transfer.

It is entirely based on Java and consists of two parts: jMessenger (client application) and jServer (server application).

Features

  1. Handles multiple users at the same time
  2. Support for both public and private messages
  3. User signup and login available 
  4. Support for file transfer

Using the code

Run the jar files jMessenger.jar and jServer.jar and do the following:

  1. On jServer select "data.xml" as database file. This file contains usernames and passwords.
  2. On jMessenger select "History.xml" as history file. This file is used to save chat history.
  3. In many cases, if jMessenger cannot find the server then adjust firewall to give it network access.

Both applications are written in Netbeans and you can import source files in Netbeans to view and edit them.

Message structure

Each message in jMessenger has four fields:

  • type: This can be set to message, login, newuser, etc.
  • sender: The username of sender
  • content: Actual content of the message
  • Recipient: Username of recipient of the message

jServer

There are two main classes in jServer for handling connections and messages. On startup the SocketServer runs in a separate thread. The job of SocketServer is to wait for connections and for each connection start a new thread ServerThread. Once the connection is established, ServerThread will listen for any messages and hand it over to SocketServer to process. Also it will forward messages from other users to the connected user.

Java
// In ServerThread read the incoming message and hand it to SocketServer

Message msg = (Message) streamIn.readObject();
server.handle(ID, msg);
.......


// In SocketServer process the messages based on their type

public synchronized void handle(int ID, Message msg){  
	if(msg.type.equals("login")){
		....
	}
	else id(msg.type.equals("message")){
		if(msg.recipient.equals("All")){ Announce("message", msg.sender, msg.content); }
		else{
			// Find the thread of recipient and forward it to him
		}
	}
.......

jMessenger

jMessenger first connects to the jServer, specified by its IP-address and port number. Arriving messages are then displayed on message board along with their senders.

When a user wants to send a file, first his request is sent via a message of type upload_req. The recipient then does the following:

  1. The recipient side sends its reply in a message of type upload_res
  2. If request is accepted then the recipient opens a new port
  3. For positive reply, recipient's IP address and port number is sent back
  4. The sender, on receiving positive reply connects to this socket and starts file upload

An advantage of this approach is that the clients can chat and transfer files at the same time. Unlike messages, files do not go through jServer.

Java
// On recipient side, start a new thread for download

Download dwn = new Download(....);
Thread t = new Thread(dwn);
t.start();
send(new Message("upload_res", ui.username, dwn.port, msg.sender));
// Reply to sender with IP address and port number
.........

// On sender side, start a new thread for file upload

// Connect to the port specified in reply
Upload upl = new Upload(addr, port, ui.file, ui);
Thread t = new Thread(upl);
t.start();

Update

There was much confusion about two issues regarding the project. I would like to clarify that here. 

1. Chat History is not complete. The project's main purpose was to demonstrate networking concepts and due to deadline limitation it was not completed.

2. Many people are confused why chat over different networks is not possible. To understand this, take the example of any web-server. For any browser to connect to a web-server, this server needs to have a global IP address so that it is visible on the Internet. Similarly jServer also is a application server and for chat over two different networks (say a campus LAN and DSL at your house), it also need to be run on a computer with a global IP address. 

About this project 

This is a class project which I wanted to share with others. Source code is licensed under The Code Project Open License (CPOL). The purpose of this project was to demonstrate Java sockets, so the whole History feature is not implemented as good as I would have liked. If this article proves to be any help, please let me know.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Student
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionUML of this program Pin
Member 141693303-Mar-19 20:17
Member 141693303-Mar-19 20:17 
QuestionFacing EOFException Pin
Member 1392833215-Sep-18 1:00
Member 1392833215-Sep-18 1:00 
Questionnumber of clients can be connected Pin
Member 1392215031-Jul-18 22:15
Member 1392215031-Jul-18 22:15 
QuestionConnection to Data base Pin
Member 1378449317-Apr-18 7:33
Member 1378449317-Apr-18 7:33 
Questionnot recommend Pin
Member 1351456210-Nov-17 11:10
Member 1351456210-Nov-17 11:10 
QuestionHow to run the code Pin
Member 1341983320-Sep-17 3:46
Member 1341983320-Sep-17 3:46 
QuestionEditing Pin
Member 1340811516-Sep-17 4:37
Member 1340811516-Sep-17 4:37 
QuestionHow to connect Pin
Member 133341742-Aug-17 4:49
Member 133341742-Aug-17 4:49 
QuestionConnection problem Pin
Member 1333553129-Jul-17 8:17
Member 1333553129-Jul-17 8:17 
QuestionWhy am I getting a connection failure??? Pin
Member 1319451712-May-17 18:24
Member 1319451712-May-17 18:24 
QuestionPLS HELP!!! Pin
Member 1319451712-May-17 18:03
Member 1319451712-May-17 18:03 
Questionnot able to connect to host Pin
Member 1315593527-Apr-17 0:19
Member 1315593527-Apr-17 0:19 
Questionchanging package names Pin
Member 1314188922-Apr-17 11:05
Member 1314188922-Apr-17 11:05 
Questionerror Pin
Member 1312966721-Apr-17 8:23
Member 1312966721-Apr-17 8:23 
QuestionGreat... Pin
Fabricio Parra13-Jan-17 17:43
Fabricio Parra13-Jan-17 17:43 
QuestionChat Application Pin
Member 1239349917-Sep-16 22:41
Member 1239349917-Sep-16 22:41 
Questionregarding computers connecting over a network Pin
Member 1269129919-Aug-16 5:46
Member 1269129919-Aug-16 5:46 
AnswerRe: regarding computers connecting over a network Pin
Member 128350397-Jul-17 3:53
Member 128350397-Jul-17 3:53 
QuestionHow to connect.... Pin
S.Shrestha5-Aug-16 3:29
S.Shrestha5-Aug-16 3:29 
QuestionRun on a vserver Pin
Member 1239643629-Jul-16 3:53
Member 1239643629-Jul-16 3:53 
QuestionTCP/UDP Pin
Member 1246746717-Apr-16 23:57
Member 1246746717-Apr-16 23:57 
AnswerRe: TCP/UDP Pin
Member 1351481910-Nov-17 11:27
Member 1351481910-Nov-17 11:27 
QuestionRegarding chat Pin
Member 1169767817-Apr-16 23:28
Member 1169767817-Apr-16 23:28 
Questionrunning this program Pin
Member 124341193-Apr-16 13:43
Member 124341193-Apr-16 13:43 
QuestionRegarding file transfer over lan Pin
Member 1206533028-Mar-16 14:56
Member 1206533028-Mar-16 14:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.