How to convert client-server chat application running on command prompt into web based application?
Asked Answered
T

3

6

I have made a mutiple client- server chat application using socket programming, which I can deploy on command prompt as JAR files. Now what I have to make changes to run this application on web browser using tomcat server?

My code for server:

package com.Aricent;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.*;
import java.sql.DriverManager;

public class Server {

    static ServerSocket serverSocket=null;
    static Socket clientSocket=null;
    static final int max=20;
    static clientThread[] threads=new clientThread[max];
    public static void main(String arg[])
    {
        int portNumber=2222;
        try{
        serverSocket=new ServerSocket(portNumber);
        }catch(IOException e)
        {
            System.out.println(e);
        }

        while(true)
        {
            try{
                clientSocket=serverSocket.accept();
                int i=0;
                for(i=0;i<max;i++)
                {
                    if(threads[i]==null)// searching for empty position
                    {
                        (threads[i]=new clientThread(clientSocket, threads)).start();
                        break;
                    }
                }
                if(i==max)
                {
                    PrintStream os=new PrintStream(clientSocket.getOutputStream());
                    os.println("Server too busy. Try later");
                    os.close();
                    clientSocket.close();
                }
            }catch(IOException e)
            {
                System.out.println(e);
            }
        }
    }

}


class clientThread extends Thread
{
    String clientName=null;
    DataInputStream is=null;
    PrintStream os=null;
    Socket clientSocket=null;
    clientThread[] threads;
    int max;
    String dbPath="jdbc:mysql://172.19.24.66:3306/chatdb";
    String dbUser="root";
    String dbPass="root";

    public clientThread(Socket clientSocket, clientThread[] threads)
    {
        this.clientSocket=clientSocket;
        this.threads=threads;
        max=threads.length;
    }

    public void run()
    {

        int max=this.max;
        clientThread[] threads=this.threads;
        boolean choice=false;
        String sender="";



        try{
            Class.forName("com.mysql.jdbc.Driver");
            Connection con=DriverManager.getConnection(dbPath,dbUser,dbPass);
            PreparedStatement ps=null;
            ResultSet rs=null;
            Statement stmt=con.createStatement();
            String query="";


            is=new DataInputStream(clientSocket.getInputStream());
            os=new PrintStream(clientSocket.getOutputStream());
            String name="";
            String ch="";
            boolean login=false;
            while(!login)
            {
                os.println("*** Press 1 to login or press 2 to register***");
                ch=is.readLine();
                os.println(ch);
                if(ch.equals("1"))
                {
                    os.println("Enter your username and password...");
                    String uname=is.readLine();
                    String upass=is.readLine();
                    query="Select * from user where username= '"+uname+"' and password= '"+upass+"'";
                    rs=stmt.executeQuery(query);
                    if(rs.next() && !rs.getString("status").equals("online"))
                    {
                        query="update user set status='online' where username='"+uname+"'";
                        stmt.executeUpdate(query);
                        login=true;
                        name=uname;
                    }
                    else
                        os.println("Sorry wrong credentials");
                }
                else if(ch.equals("2"))
                {
                    os.println("Enter your username and password and emailId for registration...");
                    String uname=is.readLine();
                    String upass=is.readLine();
                    String uemail=is.readLine();
                    query="Select username from user where emailId= '"+uemail+"'";
                    rs=stmt.executeQuery(query);
                    if(rs.next() )
                    {
                        os.println("Sorry user- "+rs.getString("username")+" already registered with this mail id");

                    }
                    else
                    {
                        query="insert into user (username,password,emailId,status) value('"+uname+"','"+upass+"','"+uemail+"','offline')";
                        stmt.executeUpdate(query);
                        os.println("Registration successful...");
                    }
                }
                else
                    os.println("Wrong input");
            }






            os.println("Welcome "+ name+" to chat room. \n To leave enter: /stop \n To start private chat enter: /Private USERNAME YOUR MESSAGE \n To stop private chat enter: /endPrivate");
            synchronized(this){
                for(int i=0;i<max;i++)
                {
                    if(threads[i]!=null && threads[i]==this){
                        clientName=name;
                        break;
                    }
                }

                for(int i=0;i<max;i++)
                {
                    if(threads[i]!=null&& threads[i]!=this)
                    {
                        threads[i].os.println("*NEW USER "+name+" ENTERed CHAT ROOM*");

                    }
                }
            }

            while(true)
            {
                int pos=0;
                String line=is.readLine();
                if(line.startsWith("/stop"))
                {
                    break;
                }
                if(line.startsWith("/endPrivate"))
                {
                    choice=false;

                }
                if(line.startsWith("/Private") || choice==true )
                {
                    choice=true;
                    //String words[];
                    if(line.startsWith("/Private"))
                    {
                        //pos=2;
                         String words[]=line.split("\\s",3);
                         sender=words[1];
                        synchronized(this)
                        {
                            for(int i=0;i<max;i++)
                            {
                                if(threads[i]!=null && threads[i]!=this && threads[i].clientName.equals(words[1]) )
                                {
                                    threads[i].os.println("<"+name+">"+words[2]);
                                    this.os.println(">>"+name+" "+words[2]); //showing the sender that msg is sent
                                    break;
                                }
                            }
                        }

                    }
                    else
                    {
                    String words[]=line.split("\\s",1);
                    synchronized(this)
                    {
                        for(int i=0;i<max;i++)
                        {
                            if(threads[i]!=null && threads[i]!=this && threads[i].clientName.equals(sender) )
                            {
                                threads[i].os.println("<"+name+">"+words[0]);
                                this.os.println(">>"+name+" "+words[0]); //showing the sender that msg is sent
                                break;
                            }
                        }
                    }
                    }
                    }
                else
                {
                    synchronized(this){
                        for(int i=0;i<max;i++)
                        {
                            if(threads[i]!=null  && threads[i].clientName!=null )
                            {
                                threads[i].os.println("< "+name+" > "+line);
                                //threads[i].os.println("** The user "+name+" is leaving the chat room **");
                            }
                        }

                    }
                }
            }

            //after while
            synchronized(this)
            {
                for(int i=0;i<max;i++)
                {
                    if(threads[i]!=null  && threads[i].clientName!=null )
                    {

                        threads[i].os.println("** The user "+name+" is leaving the chat room **");
                    }
                }
            }
                    os.println("** Bye "+name+" **");

                    synchronized(this)
                    {
                        for(int i=0;i<max;i++)
                        {
                            if(threads[i]==this)
                            {
                                threads[i]=null;
                            }




                }


            }
                    is.close();
                    os.close();
                    clientSocket.close();





        }catch(Exception e)
        {
            System.out.println(e);
        }




    }

}

Code for client:

package com.Aricent;

import java.io.*;
import java.net.*;

public class Client implements Runnable {

    static Socket clientSocket=null;
    static PrintStream os=null;
    static DataInputStream is=null;
    static BufferedReader inputLine=null;
    static boolean closed=false;

    public static void main(String arg[])
    {
        int portNumber=2222;
        String host="localhost";

        try{
            clientSocket=new Socket(host,portNumber);
            inputLine=new BufferedReader(new InputStreamReader(System.in));
            os=new PrintStream(clientSocket.getOutputStream());
            is=new DataInputStream(clientSocket.getInputStream());

        }
        catch(Exception e)
        {
            System.out.println(e);
        }

        if(clientSocket!=null&&os!=null&&is!=null)
        {
            try{
                new Thread(new Client()).start();
                while(!closed)
                {
                    os.println(inputLine.readLine().trim());
                }
                os.close();
                is.close();
                clientSocket.close();
            }catch(IOException e)
            {
                System.out.println(e);
            }
        }

    }





    //@Override
    public void run() {
        // TODO Auto-generated method stub

        String responseLine;
        try{
            while((responseLine=is.readLine())!=null)
            {
                System.out.println(responseLine);
                if(responseLine.indexOf("*** Bye")!=-1)
                    break;
            }
            closed=true;
        } catch(Exception e)
        {
            System.out.println(e);
        }

    }


}

My main query is how to introduce socket programming in local tomcat server?

Triplicate answered 16/5, 2016 at 12:44 Comment(5)
try using angular js websockets for this. I found it to be good for my chat applicationObligation
how to create html form inside Client, whose value could replace the command line input?Triplicate
you can use a javax.net.ssl.HttpsURLConnection in your code to call "ws://localhost:8080/chat-app/users" where your websocket will receive and send messages. Using "localhost:8080/chat-app/users" you can add and view users. just a thought...Obligation
You can start Sockets in any java web app. Pretty much the same way you start them in console application. But you should not do it in Servlets, because a new Thread with new Servlet instance is spawned for each HttpRequest. You can start them in static initializer or preferrably in ServletContextListener, method contextInitialized(ServletContextEvent ctx).Crusted
General note: Please exercise caution, when posting code owned by your employer on public forums. The posted code appeared to belong to Aricent.com and can get you into legal trouble.Faxun
C
4

I posted the complete solution few years ago, but it uses nodejs for server. Building a chat app that uses a node.js server in IOS. This app uses server push technology (web sockets).

If you would like to migrate your current code is the browser as it is, you will have few weeks of work only with adapting the server thread to work with HTTP from the browser. Browsers communicate with servers via HTTP protocol, which is one layer above your current solution. Your solution is using plain network sockets.

You can however build a long polling type of application with servlets on Tomcat and normal web application that repeatedly checks server for new chat messages (new request every few seconds), or experiment with latest Tomcat's Websocket support. There is example chat application in Tomcat's samples. Download zip, see /apache-tomcat-8.0.35/webapps/examples/websocket/.

Crusted answered 21/5, 2016 at 20:32 Comment(2)
how can above Client code be transformed into a servlet? Is there any way to do so?Replevy
If you will migrate your app to browser, client is web browser, server is Tomcat. There will be no client code with sockets, because browser will communicate with server. Did you look at the sample Tomcat application ?Crusted
O
2

Your application doesn't rely on any standard protocol at all. So you'll have to recreate your client from the scratch using Javascript (to make it a web application). And it will be a problem to make direct socket connections from browser using javascript (once you go out of localhost connections you will be under browsers security limitations).

As a strait-forward approach: run server as jar application, and client - custom Applet (Oh! that is so 90's - 00's). And I guess in year or two Applets become obsolete.

It would be better if you rewrite your application using something more standard, like STOMP over WebSockets. Then your server could be deployed into servlet container like Tomcat or Jetty. And your client would be anything that supports websockets and STOMP.

From what I have seen your application has authentication and chat-rooms. It is better to deliver authentication and authorization to custom framework (anything you like, simply provide additional headers in websocket connections to merge WS connection and established session). And Chat-rooms in STOMP words become destinations. So you would need to create app that is reacting on messages arriving on stomp destinations.

I would recommend for you to look at spring framework and its support for websockets.

Also, what I have seen you are establishing separate database connection per each user session, what in general is lavish use of resources. Create pool of connection and use one of them only when it is needed.

Osterman answered 24/5, 2016 at 11:44 Comment(0)
C
1

You could use pusherjs if you use NPM. Pusherjs has a free plan and it takes away the headache of creating and managing socket connections. Each user can be assigned individual channels(free plan supports unlimited channels) and messages just need to be submitted to that channel and you can have the client app continuously listen on that channel. Its very very easy.

Cat answered 27/5, 2016 at 7:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.