Like Us on Facebook

How to make Realtime chat Application in Android

 Hi friends , In  my previous post  How to create Chat Application in Android studio  we had seen how To make user  Interface  of  a  chat Application  . Though there are lots of way to make  realtime  chat apps like using parse Integration ,making chat  application from scratch ,Google Cloud Messaging (GCM),etc. I will explain it one by one in my upcomming  post .
 In this post I am going to share  how to  do server side Socket programming  so  that   you  can chat from your handset  and  also from the web. This Application is made in Eclipse adding  J2EE and Tomcat server support.


 Prerequisite:
  •  JDK 6.0 or above
  •  Eclipse and Android SDk
  •  Tomcat 7 server.


 1. First Download apache tomcat 7 from tomcat website. Once download complete, extract it in some location.


 2. In Eclipse go to Help Install New Software. Click on Work with drop down and select Juno –  http://download.eclipse.org/releases/juno. (You need to select the appropriate eclipse release depending upon your eclipse  flavour)


 3. Expand Web, XML, Java EE and OSGi Enterprise Development and select below Extension and proceed to installation.
  • Eclipse java EE developer Tools.
  • JST server Adapters
  • JST server Adapter extension
 

4. Once Installation complete , Eclipse will prompt you to restart. When the eclipse re-opened, we need to create a server first.  From  goto Windows Show View Server Servers.


5. In servers tab, click on new server wizard and select Apache Tomcat v7.0 Server. Give your server name, browse and   select the tomcat home directory which you downloaded.


6. Find your IP address . from windows  open Terminal and type ipconfig or  on  Mac   type   ifconfig .

 

7. Building the Socket Server
In Eclipse create a new Dynamic Web Project by navigating to File ⇒ New ⇒ Other ⇒ Web ⇒ Dynamic Web Project. Give  the project name and select the Target runtime as Tomcat 7. I gave my project name as MobileGroupChatServer. it has  following structures.






8. Create a new class named JSONUtils.java under project’s  src  package folder. This class contains methods to generate JSON strings those are required to have the communication b/w socket server and clients. In the following code, if you observe each json contains  flag  node which tell the clients the purpose of JSON message. On the client side we have to take appropriate action considering the flag value.
 
    public class JSONUtils {

 // flags to identify the kind of json response on client side
 private static final String FLAG_SELF = "self", FLAG_NEW = "new",
 FLAG_MESSAGE = "
message", FLAG_EXIT = "exit";

 public
JSONUtils() {
 }


 /**
 * Json when client needs it's own session details
 * */

 public String getClientDetailsJson(String sessionId, String message) {
 String json = null;

 
try {
 JSONObject jObj = new JSONObject();
  jObj.put("flag", FLAG_SELF);
  jObj.put("sessionId", sessionId);
  jObj.put("message", message);
  json = jObj.toString();

  } catch (JSONException e) {
  e.printStackTrace();
  }
  return json;
  }

 
/**
  * Json to notify all the clients about new person joined
  * */

  public String getNewClientJson(String sessionId, String name, String message, int onlineCount) {
  String json =
null;
 
try {
 
JSONObject jObj = new JSONObject();
  jObj.put("flag", FLAG_NEW);
  jObj.put("name", name);
  jObj.put("sessionId", sessionId);
  jObj.put("message", message);
  jObj.put("onlineCount", onlineCount);
  json = jObj.toString();

  } catch (JSONException e) {
  e.printStackTrace();
  }
  return json;
  }
 
/**
  * Json when the client exits the socket connection
  * */

  public String getClientExitJson(String sessionId, String name,
  String message, int onlineCount
) {
  String json = null;
  
try {
 
JSONObject jObj = new JSONObject();
  jObj.put("flag", FLAG_EXIT);
  jObj.put("name", name);
  jObj.put("sessionId", sessionId);
  jObj.put("message", message);
  jObj.put("onlineCount", onlineCount);
  json = jObj.toString();

  } catch (JSONException e) {
  e.printStackTrace();
  }
  return json;
  }
 
/**
  * JSON when message needs to be sent to all the clients
 * */

  public String getSendAllMessageJson(String sessionId, String fromName, String message) {
  String json = null;
   
try {
  JSONObject jObj = new JSONObject();
  jObj.put("flag", FLAG_MESSAGE);
  jObj.put("sessionId", sessionId);
  jObj.put("name", fromName);
  jObj.put("message", message);
  json = jObj.toString();

  } catch (JSONException e) {
  e.printStackTrace();
  }
  return json;
  }
  }



 9. Create another class SocketServer.java  and add the following code. here we implement actual socket server.
 
 @ServerEndpoint("/chat")
  public class SocketServer {

 
// set to store all the live sessions
  private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
 
// Mapping between session and person name
  private static final HashMap<String, String> nameSessionPair = new HashMap<String, String>();
  private JSONUtils jsonUtils = new JSONUtils();
 
// Getting query params
  public static Map<String, String> getQueryMap(String query) {
  Map<String, String> map = Maps.newHashMap();
  if (query != null) {
 
String[] params = query.split("&");
  for (String param : params) {
  String[] nameval = param.split("=");
  map.put(nameval[0], nameval[1]);

  }
  }
  return map;
  }


  /**
  * Called when a socket connection opened
     * */

  @OnOpen
  public void onOpen(
Session session) {
  System.out.println(
session.getId() + " has opened a connection");
  Map<String, String> queryParams = getQueryMap(session.getQueryString());
  String name = "";
  if (queryParams.containsKey("name")) {
 
// Getting client name via query param
  name = queryParams.get("name");
  try {
  name = URLDecoder.decode(name, "UTF-8");
  } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
  }
 
// Mapping client name and session id
  nameSessionPair.put(session.getId(), name);
  }

 // Adding session to session list
 sessions.add(session);
  try {

  // Sending session id to the client that just connected
  session.getBasicRemote().sendText(
  jsonUtils.getClientDetailsJson(session.getId(),"Your session details"));
  } catch (IOException e) {
  e.printStackTrace();
  }
 
// Notifying all the clients about new person joined
  sendMessageToAll(session.getId(), name, " joined conversation!", true,
  false);
  }

 
/**
  * method called when new message received from any client
  * 
  * @param message
  * JSON message from client
     * */

  @OnMessage
   public void onMessage(
String message, Session session) {
   System.out.println("
Message from " + session.getId() + ": " + message);
   String msg = null;

   // Parsing the json and getting message
   try {
 
 JSONObject jObj = new JSONObject(message);
   msg = jObj.getString("message");

   } catch (JSONException e) {
   e.printStackTrace();
   }
 
// Sending the message to all clients
  sendMessageToAll(session.getId(), nameSessionPair.get(session.getId()),
  msg, false, false);
  }

  /**
  * Method called when a connection is closed
 * */
 @OnClose
  public void onClose(Session session) {
  System.out.println("Session " + session.getId() + " has ended");
 
 // Getting the client name that exited
  String name = nameSessionPair.get(session.getId());
 
// removing the session from sessions list
  sessions.remove(session);
 
// Notifying all the clients about person exit
  sendMessageToAll(session.getId(), name, " left conversation!", false, true);
  }

  /**
  * Method to send message to all clients
  * 
  * @param sessionId
  * @param message
  *            message to be sent to clients
  * @param isNewClient
  *            flag to identify that message is about new person joined
  * @param isExit
  *            flag to identify that a person left the conversation
  * */

  private void sendMessageToAll(String sessionId, String name,
  String message, boolean isNewClient, boolean isExit) {
 
// Looping through all the sessions and sending the message individually
  for (Session s : sessions) {
   String json = null;
 
// Checking if the message is about new client joined
  if (isNewClient) {
  json = jsonUtils.getNewClientJson(sessionId, name, message, sessions.size());
  } else if (isExit) {
 
// Checking if the person left the conversation
  json = jsonUtils.getClientExitJson(sessionId, name, message,
  sessions.size());
  } else {
 
// Normal chat conversation message
  json = jsonUtils
  .getSendAllMessageJson(sessionId, name, message);
   }
   try {
 
 System.out.println("Sending Message To: " + sessionId + ",  + json);
   s.getBasicRemote().sendText(json);

   } catch (IOException e) {
   System.out.println("
error in sending. " + s.getId() + ", "+ e.getMessage());
   e.printStackTrace();
   }
   }
   }
   }


 



 10. Now to Build the WebApp you need to put  html ,css, jquery file in WebContent folder. Download the  whole project source code from below link
 

Posted By UandBlog

UandBlog is a Global Leading source of Finance, Health, Lifestyle, Technology, Gaming and Programing and other information, it is a fastest growing blog for all , for latest post or information like us on facebook , follow on Twitter, Google+ and Pinterest.

Comments ( 5 )

Alexey Rykov:
Thanks from Ukraine
Admin:
thanx to all of you
Alexey Rykov:
Thanks from Ukraine
Admin:
محمد مساوى:
Thanks from yemen
Admin:
thanx to all of you
Fatih Han:
Thanks from Macedonia
Admin:
thanx to all of you
Tosif Hakeem:
sir i does not have Eclipse in my system. will you please give same explanation for android studio user? Thank you in advance

    Leave a comment..

    Click to login.

    Subscribe Latest Information

    Most Popular Posts

    You May Like Also