Chat Forum in Java
Chat Forum in Java
PODDAR INSTITUTE OF
MANAGEMENT AND TECHNOLOGY
[Affiliated to Maulana Abul Kalam Azad University of Technology]
A MICRO-PROJECT REPORT
ON
“Chat Forum for Multiple User”
FOR
Computer Networks Lab (CS692)
Submitted by
1
Table of Contents
Topics Page No
1. Introduction 4
3. Output 8-9
4. Discussion 10
2
Implement a chat forum where
more than one clients can chat with
each other
3
Introduction
A group chat application will be implemented in the project using MulticastSocket (Java
Platform SE 8) class is discussed. A MulticastSocket is a (UDP) DatagramSocket, with
additional capabilities for joining “groups” of other multicast hosts on the internet.
When one sends a message to a multicast group, all subscribing recipients to that host and port
receive the message (within the time-to-live range of the packet, see below). The socket needn't
be a member of the multicast group to send messages to it.
When a socket subscribes to a multicast group/port, it receives datagrams sent by other hosts to
the group/port, as do all other members of the group and port. A socket relinquishes membership
in a group by the leaveGroup(InetAddress addr) method. Multiple MulticastSocket's may
subscribe to a multicast group and port concurrently, and they will all receive group datagrams.
4
Source Code
import java.net.*;
import java.io.*;
import java.util.*;
public class GroupChat
{
private static final String TERMINATE = "Exit";
static String name;
static volatile boolean finished = false;
public static void main(String[] args)
{
if (args.length != 2)
System.out.println("Two arguments required: <multicast-host>
<port-number>");
else
{
try
{
InetAddress group = InetAddress.getByName(args[0]);
int port = Integer.parseInt(args[1]);
Scanner sc = new Scanner(System.in);
System.out.print("Enter your name: ");
name = sc.nextLine();
MulticastSocket socket = new MulticastSocket(port);
socket.joinGroup(group);
Thread t = new Thread(new
ReadThread(socket,group,port));
5
while(true)
{
String message;
message = sc.nextLine();
if(message.equalsIgnoreCase(GroupChat.TERMINATE))
{
finished = true;
socket.leaveGroup(group);
socket.close();
break;
}
message = name + ": " + message;
byte[] buffer = message.getBytes();
DatagramPacket datagram = new
DatagramPacket(buffer,buffer.length,group,port);
socket.send(datagram);
}
}
catch(SocketException se)
{
System.out.println("Error creating socket");
se.printStackTrace();
}
catch(IOException ie)
{
System.out.println("Error reading/writing from/to socket");
ie.printStackTrace();
}
}
}
}
class ReadThread implements Runnable
{
private MulticastSocket socket;
private InetAddress group;
private int port;
private static final int MAX_LEN = 1000;
ReadThread(MulticastSocket socket,InetAddress group,int port)
{
6
this.socket = socket;
this.group = group;
this.port = port;
}
@Override
public void run()
{
while(!GroupChat.finished)
{
byte[] buffer = new byte[ReadThread.MAX_LEN];
DatagramPacket datagram = new
DatagramPacket(buffer,buffer.length,group,port);
String message;
try
{
socket.receive(datagram);
message = new
String(buffer,0,datagram.getLength(),"UTF-8");
if(!message.startsWith(GroupChat.name))
System.out.println(message);
}
catch(IOException e)
{
System.out.println("Socket closed!");
}
}
}
}
Additional Instruction
Save the file as GroupChat.java and compile it using javac and then run the program using two
command line arguments as specified. A multicast host is specified by a class D IP address and
by a standard UDP port number. Class D IP addresses are in the range 224.0.0.0 to
239.255.255.255, inclusive. The address 224.0.0.0 is reserved and should not be used.
7
Output
8
9
Discussion
We have used the multicast host IP address as 239.0.0.0 and the port number as 1234 (since the
port numbers 0 through 1023 are reserved). There are 3 members in the group: Ironman,
CaptainAmerica, and Groot. Start all three terminals first before sending the message, otherwise
messages which are sent before starting the terminal are lost (since there is no facility of buffer
incorporated to store the messages.) We need two threads in this application. One for accepting
the user input (using the java.util.Scanner class) and the other for reading the messages sent from
other clients. Hence I have separated the thread which does the reading work into
ReadThreadclass. For leaving the group, any of the user can type in Exit to terminate the session.
The above program is executed on a single machine. Socket programming is meant for
distributed programming. The same piece of code snippet when present on different machines
which have Java installed can satisfy that requirement. This is just the bare bones service logic.
The project would be even more fascinating if the front-end is developed. You can use Java’s
AWT (Abstract Window Toolkit) or its advanced counterpart, Java Swing to develop the front
end. Since this wouldn’t be part of Socket programming I’m leaving it untouched without getting
into the details.
Additional points:
10