Questions & AnswersJava Programming

import java.io.*; import java.net.*; import javax.swing.*; import...

Question
Answered step-by-step
Asked by ConstableChinchilla2624 on coursehero.com

import java.io.*; import java.net.*; import javax.swing.*; import...


import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class SimpleChatClient{ 
	public  final boolean verbose = true;
    JTextArea incoming;
    JTextField outgoing, name, to;
    JLabel labelName, labelTo, labelMessage;
    JCheckBox fancy, encrypt;
    BufferedReader reader;
    PrintWriter writer;
    Socket sock;
    String todayS, timeS, minS, secS;
    Calendar now; int year,month,day,hour,min,sec;
  
    public static void main(String args[]) throws IOException {
		System.out.println("Chat Service");
		SimpleChatClient Client = new SimpleChatClient();
		Client.go();
    }
    
    public void go() {
        JFrame frame = new JFrame(" Chat Client");
        int sec = Integer.parseInt(processTime(3));
        if( sec > 50 ) frame.setBackground(Color.blue);
             else if( sec > 40 ) frame.setBackground(Color.magenta);
               else if( sec > 30 ) frame.setBackground(Color.yellow);
                 else if( sec > 20 ) frame.setBackground(Color.red);
                   else if( sec > 10 ) frame.setBackground(Color.black);
                                  else frame.setBackground(Color.green);
        frame.setBounds(400+5*sec,8*sec,300,300);
        JPanel mainPanel = new JPanel();
        incoming = new JTextArea(15, 50);
        incoming.setLineWrap(true);
        incoming.setWrapStyleWord(true);
        incoming.setEditable(false);
        incoming.setText("Client logged on "+processTime(2) +"\n");
        JScrollPane qScroller = new JScrollPane(incoming);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        outgoing = new JTextField(20);
        name = new JTextField(20);
        to = new JTextField(20);
        JCheckBox fancy = new JCheckBox("Fancy", false);
        JCheckBox encrypt = new JCheckBox("Encrypt", false);
        labelName = new JLabel("NAME");
        labelTo = new JLabel("TO");
        labelMessage = new JLabel("Type Message Here:");
        JButton sendButton = new JButton("Send");
        sendButton.addActionListener(new SendButtonListener());
        mainPanel.add(labelName);
        mainPanel.add(name);
        mainPanel.add(labelTo);
        mainPanel.add(to);
        mainPanel.add(fancy);
        mainPanel.add(encrypt);
        mainPanel.add(qScroller);
        mainPanel.add(labelMessage);
        mainPanel.add(outgoing);
        mainPanel.add(sendButton);
        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
        setUpNetworking();
        
        Thread readerThread = new Thread(new IncomingReader()); //thread to read incoming messages
        readerThread.start();
        
        frame.setSize(650, 500);
        frame.setVisible(true);
        
        
        
    }
    
    public String processTime(int option){   
	     now = Calendar.getInstance();
         year = now.get(Calendar.YEAR); 
         month = now.get(Calendar.MONTH)+1; 
         day = now.get(Calendar.DAY_OF_MONTH);
         hour = now.get(Calendar.HOUR);
         min =  now.get(Calendar.MINUTE);	  
         sec =  now.get(Calendar.SECOND);
         if (min < 10 )  minS =  "0" + min ;  else  minS = "" + min;
         if (sec < 10 )  secS =  "0" + sec ;  else  secS = "" + sec;
         todayS =  month + " / " + day + " / " + year;  
         timeS  = hour + " : " + minS + " : " + secS; 
         switch(option) {
         case (0):  return todayS  ; 
         case (1):  return timeS;
         case (2):  return todayS + " @ " + timeS ; 
         case (3): return secS;
        } 
        return null;  // should not get here
     }
    
    private void setUpNetworking() {
        try {if (verbose) System.out.println("Openning socket at port 5000");
            sock = new Socket("127.0.0.1", 5001);
            InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
            reader = new BufferedReader(streamReader);
            writer = new PrintWriter(sock.getOutputStream());
            System.out.println("networking protocol established");
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }
    }
    
    public class SendButtonListener implements ActionListener {
    	public void actionPerformed(ActionEvent ev) {
    		try {
            	String message = outgoing.getText();
            	if(verbose) System.out.println("Sending coded message ==>" + message);
            	writer.println(message);
            	writer.flush();
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
            outgoing.setText("");
            outgoing.requestFocus();
        }
    }
    
    
    
       
    /** Internal class to handle the IncomingReader Handler
    The benefit of using an internal class is that we have access to the various objects of the 
    external class
    
    */
    
    class IncomingReader implements Runnable{
    	/**
    	 * Method RUN to be executed when thred.start() is executed
    	 */
    	public void run() {
    		String message;
    		try {
    			while((message = reader.readLine()) != null) {
    				incoming.append(message + "\n");
    			}
    		}
    		catch (IOException ex) {
    			ex.printStackTrace();
    		}
    	}
    }

}



 

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

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class ChatServer extends JFrame implements WindowListener{   
	Hashtable<String, SockAndWriter> toHash;
    Vector<PrintWriter> clientOutputStreams;
    BufferedReader reader;
    Socket sock;
    public final boolean verbose = true;
    public  JTextArea  result = new JTextArea(20,30);
    public JScrollPane jsp = new JScrollPane(result);
    public Font f = new Font("Helvetica", Font.BOLD,16);
    JLabel timeLabel = new JLabel("Date and Time ", JLabel.RIGHT);
    JTextField timeField = new JTextField("");
    JPanel  displayTime = new JPanel(new GridLayout(1,2));
    //JPanel panel = new JPanel(new BorderLayout());
    int year,month,day,hour,min,sec;
    String todayS, timeS, minS, secS;
    Calendar now;
    String recipient;
    String originator;
    String content;
    boolean encrypt;
    boolean fancyFrame;
    
    public static void main(String args[]) {
    	System.out.println("Chat Service");
	    new ChatServer();
	}
    
    
    /** Constructor
     * 
     */
    
    public String processTime(int option)
	   {    now = Calendar.getInstance();
	        year = now.get(Calendar.YEAR); 
            month = now.get(Calendar.MONTH)+1; 
            day = now.get(Calendar.DAY_OF_MONTH);
            hour = now.get(Calendar.HOUR);
            min =  now.get(Calendar.MINUTE);	  
            sec =  now.get(Calendar.SECOND);
            if (min < 10 )  minS =  "0" + min ;  else  minS = "" + min;
            if (sec < 10 )  secS =  "0" + sec ;  else  secS = "" + sec;
            todayS =  month + " / " + day + " / " + year;  
            timeS  = hour + " : " + minS + " : " + secS; 
            switch(option) {
            case (0):  return todayS  ; 
            case (1):  return timeS;
            case (2):  return todayS + " @ " + timeS ; 
           } 
           return null;  // should not get here
        }
     
    public ChatServer() {
    	setLayout(new BorderLayout());
    	setTitle("Chat Server");
		setSize(600, 800);
		displayTime.add(timeLabel);displayTime.add(timeField);
		timeLabel.setFont(f);
		result.setFont(f);
		add(displayTime,BorderLayout.NORTH);
		add(result,BorderLayout.CENTER);
		addWindowListener(this);
 	    setVisible(true);
    	clientOutputStreams = new Vector<PrintWriter>();
        toHash = new Hashtable<String, SockAndWriter>();
        try {
            ServerSocket serverSock = new ServerSocket(5001);
             if (verbose) System.out.println(" Server IP 127.0.0.1. ready at port 5001 " );
                if (verbose) System.out.println(" ___________________"
                    +"________________________________________________"  ); 
            result.append("Server started on " + processTime(2)+"\n");
            if (verbose) { System.out.println ("\nStart Server on " + processTime(2)); 
             timeField.setText(processTime(2));
             }   
            while(true) {
                Socket clientSocket = serverSock.accept();
                PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
                System.out.println(" Connection " + writer);
                clientOutputStreams.add(writer);  
                Thread t = new Thread(new ClientHandler(clientSocket));
                t.start();  // to execute the run() method of ClientHandler
                if(verbose) System.out.println("A new client has connected!");
            }
        } catch (Exception ex) { ex.printStackTrace(); }
    }
       
   
     /**
      * Encrypts a command
      * @param option
      * @param true for encrypt, false for decrypt
      * @param str String that is being encrypted/decrypted
      * @return String to encrypted/decrypted
      */
	public String EncodeDecode(boolean option, String str){
		String x = "";
    	byte[] incoming = str.getBytes();
    	byte[] outgoing = new byte[incoming.length];
    	for(int i = 0; i < incoming.length; i++)
    	 if(option)  outgoing[i] = (byte)(incoming[i]+5);
    	 else outgoing[i] = (byte)(incoming[i]-5);
    	x = new String(outgoing);
    	return x;
	}
    
	
	
    /** Internal class to handle the Client Handler
    The benefit of using an internal class is that we have access to the various objects of the 
    external class
    
    */
     public class ClientHandler implements Runnable { 
	/**
       * Constructor of the inner class
       * @param clientSocket
       */
       public ClientHandler(Socket clientSocket) {
            try {
            	sock = clientSocket;
            	InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
            	reader = new BufferedReader(isReader);
                if (verbose) System.out.println("new client " );
                if (verbose) System.out.println(" new client at address "
                  +  sock.getLocalAddress() + " at port " +  sock.getLocalPort()); 
                if (verbose) System.out.println(" Client at address " 
                    +  sock.getInetAddress() + " at port " +  sock.getPort()  );
                if (verbose) System.out.println(" ___________________"
                    +"________________________________________________"  ); 
                clientOutputStreams = new Vector<PrintWriter>();
                toHash = new Hashtable<String, SockAndWriter>();
                
            } 
            catch (Exception ex) {
            	ex.printStackTrace(); 
            }
       }
       
       public void tellEveryone(String message) {
           Iterator<PrintWriter> it = clientOutputStreams.iterator();
           result.append(message + " broadcasted on " + processTime(2)+ "\n");
           System.out.println( " has Next " + it.hasNext());
           while (it.hasNext()) {
               try {
                   PrintWriter writer = (PrintWriter) it.next();
                   System.out.println("all message" + message);
                   writer.println(message);
                   writer.flush();
               } 
               catch (Exception ex) { 
            	   ex.printStackTrace(); 
               }
           }
       }
       
       public void tellSomeone(String to, String message) { 
    	   System.out.println(message + " sent to " + to + "\n");
    	   result.append(message + " sent on " + processTime(2) + "\n");
    	   try {
    		   Socket sock = toHash.get(to).s;
    		   String name = toHash.get(to).name;
    		   PrintWriter writer = toHash.get(to).pw;
    		   System.out.println(name + " message to be sent to " + to);
    		   System.out.println(">>>>>>>ht " + to + " " + writer.toString());
    		   writer.println(message);
    		   writer.flush();
    	   }
    	   catch (Exception ex) {
    		   ex.printStackTrace();
       	   }
       }
       
       public void closeEverything(Socket sock, BufferedReader bufferedReader, BufferedWriter bufferedWriter) {
    	   try {
    		   if(bufferedReader != null) {
    			   bufferedReader.close();
    		   }
    		   if(bufferedWriter != null) {
    			   bufferedWriter.close();
    		   }
    		   if(sock != null) {
    			   sock.close();
    		   }
    	   }
    	   catch(IOException e) {
    		   e.printStackTrace();
    	   }
       }
       
        /**
         * Method RUN to be executed when thread.start() is executed
         */
        public void run() {
            String messageFromClient, to;
            try {
                while ((messageFromClient = reader.readLine()) != null) { 
                	System.out.println(" message recieved " + messageFromClient);
                		to = anaMess(messageFromClient);
                	System.out.println( " telling " + messageFromClient + " To " + to);
                	if (to.equals("ALL")) tellEveryone(messageFromClient);
                	else tellSomeone(to, messageFromClient);
                }     
            } 
            catch (Exception ex) {
            	ex.printStackTrace();
            }
        }
        
        /**
         * while(sock.isConnected()) {
         *    try{
         *       messageFromClient = bufferedReader.readLine();
         *    }
         * }
         * 
         */
       
        public String anaMess(String message) throws Exception {
        	String element;
        	PrintWriter writer = new PrintWriter(sock.getOutputStream());
        	content = "";
        		result.append("message recieved " + message + " on " + processTime(2) + "\n");
        	StringTokenizer st = new StringTokenizer(message);
        	while(st.hasMoreElements()) {
        		element = st.nextToken();
        		if(element.equals("NAME")) {
        			originator = st.nextToken();
        			SockAndWriter sw = new SockAndWriter(originator, sock, writer);
        			toHash.put(originator, sw);
        			System.out.println("!ht " + originator + " " + sock.toString());
        		}
        		else if(element.equals("TO")) recipient = st.nextToken();
        		else if(element.equals("MESS")) {
        			while(st.hasMoreElements()) {
        				content = content + " " + st.nextToken();
        			}
        		}
        		else if(element.equals("ENC")) {
        			if((st.nextToken()).equals("true")) {
        				encrypt = true;
        			}
        			else {
        				encrypt = false;
        			}
        		}
        		else if(element.equals("FANCY")) {
        			if((st.nextToken()).equals("true")) {
        				fancyFrame = true;
        			}
        			else {
        				fancyFrame = false;
        			}
        		}
        		//System.out.println("token is " + element);
        	}
			return content;
			
        }
    }





	@Override
	public void windowOpened(WindowEvent e) {
		
	}


	@Override
	public void windowClosing(WindowEvent e) {
		
	}


	@Override
	public void windowClosed(WindowEvent e) {
	
	}


	@Override
	public void windowIconified(WindowEvent e) {
	
	}


	@Override
	public void windowDeiconified(WindowEvent e) {
		
	}


	@Override
	public void windowActivated(WindowEvent e) {
		
	}


	@Override
	public void windowDeactivated(WindowEvent e) {
		
	}  
    
    
}

I am currently working on a multi client-server system that allows for any number of clients to access a chat server and send messages back and fourth to each other. However, I am running into issues. 

 

First, I need to give the the clients the option to send their chat messages to EVERYONE in the server or just ONE individual. I have already created the code necessary for that in my "ChatServer" Java Class but do not know how to connect that code to the "SimpleChatServer" Java Class itself.

 

Next, I need to give the clients the option to encrypt their message before they send it as well as the option to send a message with a sound and image along with it, as sort of a "fancy" way of messaging someone. I've decided to use JCheckBoxes and implement them into the JFrame. The idea is that if the "Encrypt" checkbox is selected, the message will be ecrytped, and if the "Fancy" checkbox is selected, the message will contain a sound and image (that will already be a part of the program's files) so when the message is recieved by the recipient, both will play. Unfortunately, I do not know how to implement those two things. 

 

I've sent you all that I've done so far and would greatly appreciate your assistance. I understand this may be alot to ask, but any and all help would be appreciated!

Answer & Explanation

Solved by verified expert
Answered by SargentStrawHummingbird33 on coursehero.com
sectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem i
sectetur adipiscing eli
CliffsNotes Logo

Unlock access to this and over
10,000 step-by-step explanations

Unlock Explanation

Have an account? Log In

<pre><code class="language-plaintext">sectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante</code></pre>

Step-by-step explanation

sectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat

 

 

sectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec f

 

sectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapib

Other answer

Answered by CoachGalaxyPolarBear32 on coursehero.com

secte

sectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia
CliffsNotes Logo

Unlock access to this and over
10,000 step-by-step explanations

Unlock Explanation

Have an account? Log In

<p>secte</p>sectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia

Step-by-step explanation

sectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacinia pulvinar tortor nec facilisis. Pellentesque dapibus efficitur laoreet. Nam risus ante, dapibus a molestie consequat, ultrices ac magna. Fusce dui lectus, congue vel laoreet ac, dictum vitae odio. Donec aliquet. Lorem ipsum dolor sit amet, consectetu

Get unstuck with a CliffsNotes subscription

Example CliffsNotes Question and Answer
Unlock every step-by-step explanation, download literature note PDFs, plus more.Get Access

Related Q&A