How to convert a chat-client-client application running on the command line into a web application?

I made a multiple client application for client-server using socket programming, which I can deploy on the command line as JAR files. Now I have to make changes to run this application in a web browser using the tomcat server?

My server code is:

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); } } } 

Customer Code:

 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 request is how to introduce socket programming on the local tomcat server?

+6
source share
3 answers

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

If you want to transfer your current code, this is the browser as it is, you will have several weeks of work only with the adaptation of the server stream for working with HTTP from the browser. Browsers communicate with servers through the HTTP protocol, which is one layer above your current solution. Your solution uses simple network sockets.

However, you can create a long polling type with servlets on Tomcat and a regular web application that re-checks the server for new chat messages (a new request every few seconds) or experiments with the latest Tomcat Websocket support. Tomcat samples have a chat example. Download zip, see / apache-tomcat-8.0.35 / webapps / examples / websocket /.

+4
source

Your application does not rely on any standard protocol. Thus, you have to recreate the client from scratch using Javascript (to make it a web application). And it will be a problem to make direct socket connections from the browser using javascript (as soon as you exit the local connections, you will be under browser security restrictions).

As a scroll forward approach: start the server as a jar application and the client user applet (Oh !, this is 90 - 00's). And I think a year or two applets are becoming obsolete.

It would be better if you rewrote your application using something more standard, for example, STOMP via WebSockets. Your server can then be deployed to a servlet container, such as Tomcat or Jetty. And your client will be what supports websockets and STOMP.

From what I saw, your application has authentication and chats. It is better to deliver authentication and authorization to the user infrastructure (whatever, just provide additional headers in the connections on the network to combine the WS connection and the established session). And chats in STOMP words become destinations. Thus, you will need to create an application that responds to messages arriving at destinations.

I would recommend you take a look at the spring framework and its support for websockets.

In addition, I saw that you are establishing a separate database connection for each user session, which is generally a generous use of resources. Create a connection pool and use one of them only when necessary.

+2
source

You can use pusherjs if you use NPM. pusherjs has a free plan and it eliminates the headache of creating and managing socket connections. Each user can be assigned separate channels (the free plan supports unlimited channels), and messages must be sent to this channel, and you can constantly connect the client application to this channel. It is very easy.

+1
source

All Articles