View Single Post
Old 03-28-2011, 06:16 PM   PM User | #1
mimis40
New Coder

 
Join Date: Mar 2011
Location: Utah
Posts: 30
Thanks: 0
Thanked 6 Times in 6 Posts
mimis40 is on a distinguished road
Java multi-threaded test taker

I am in the middle of making a test taking program for my programming class. I have both a server and a client side; however, for some reason the two are not sending and receiving messages to each other like they should be doing.

Here is the code or if you would like me to send you the netbeans folder tell me your email:

Answers class:

Code:
import java.io.*;
import java.util.Scanner;

public class Answers extends javax.swing.JFrame implements Runnable{
    private PrintWriter out;
    private Scanner in;
    private String message, inMessage;
    private boolean sent = false;
    
    public Answers() {
        
        initComponents();
        this.setTitle("Answers");
    
    }
   
    public void run(){
        while(true){
            //get the message from the server
            receiveMessage(inMessage);
            if(inMessage.equals("sent")){
                sent = false;
            }
            if(inMessage.equals("new") && !sent){
                Submit.setEnabled(true);
                sent = true;
            }
        }
    }
    
    
    public void setOut(PrintWriter out) {
        this.out = out;
    }
    
    public void setIn(Scanner in){
        this.in = in;

    }

    public void sendMessage(String msg){
        out.println(msg);
        //System.out.println(msg);
    }
    
    public void receiveMessage(String msg){
        try{
            msg = in.nextLine();
        }catch(Exception e){
            System.err.println(e);
        }
    }

        private void CActionPerformed(java.awt.event.ActionEvent evt) {                                  

}                                 

private void SubmitActionPerformed(java.awt.event.ActionEvent evt) {                                       

        if(A.isSelected()){
            message = "a";
            sendMessage(message);
        }
        if(B.isSelected()){            
            message = "b";
            sendMessage(message);
        }
        if(C.isSelected()){            
            message = "c";
            sendMessage(message);
        }
        if(D.isSelected()){           
            message = "d";
            sendMessage(message);
        }
        if(E.isSelected()){           
            message = "e";
            sendMessage(message);
        }
        if(F.isSelected()){
            message = "f";
            sendMessage(message);
        }
        
        Submit.setEnabled(false);      

}                                      

        public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Answers().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JRadioButton A;
    private javax.swing.JRadioButton B;
    private javax.swing.JRadioButton C;
    private javax.swing.JRadioButton D;
    private javax.swing.JRadioButton E;
    private javax.swing.JRadioButton F;
    private javax.swing.JButton Submit;
    private javax.swing.ButtonGroup gbnAnswers;
    private javax.swing.JLabel jLabel1;[/ICODE]

Client class:

import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import javax.swing.JOptionPane;


public class Client extends javax.swing.JFrame {
    private Socket echoSocket = null;
    static String username = null;
    boolean connected = false;
  
    private Scanner in = null;
    private PrintWriter out = null;
    
    public Client() {
        initComponents();
    }
    private String ipAddress = "";

    
    
    //public void setOut(PrintWriter out){
    //    out = answers.setOut(out);
    //}
            
private void DoneActionPerformed(java.awt.event.ActionEvent evt) {                                     
    ipAddress = IP.getText();
    username = Name.getText();
    Answers answers = new Answers();
    if(username.isEmpty() || ipAddress.isEmpty()){
        JOptionPane.showMessageDialog(this, "Please enter the IP address and your name");
    }
    else{
        try {
            echoSocket = new Socket(ipAddress, 7);
            out = new PrintWriter(echoSocket.getOutputStream());
            in = new Scanner(echoSocket.getInputStream());
            //user is connected
            connected = true;
            //set the inputstream and outputstream in Answers
            answers.setOut(out);
            answers.setIn(in); 
            
            
            
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: " + ipAddress + ".");
            e.printStackTrace();
            System.exit(1);
        } catch (IOException e){
            System.err.println("IO Exception Error\n");
            e.printStackTrace();
        }
        try{
            answers.sendMessage("Hello World");
        }
        catch(Exception e){
            System.out.println("Could not connect to the server");
            e.printStackTrace();
        }
        if(connected){
            answers.run();
            Toolkit toolkit = Toolkit.getDefaultToolkit();
            Dimension screenDim = toolkit.getScreenSize();
            int answersWidth = answers.getWidth(), answersHeight = answers.getHeight();

            setVisible(false);
            answers.setDefaultCloseOperation(HIDE_ON_CLOSE);
            answers.setLocation((screenDim.width - answersWidth)/2, (screenDim.height - answersHeight)/2);
            answers.setVisible(true);
        } else{
            JOptionPane.showMessageDialog(this, "Could not connect to server, try again");
        }
            
        
    }
       
    
}                                    
  
        public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Client().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton Done;
    private javax.swing.JTextField IP;
    private javax.swing.JTextField Name;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;

Client Handler class
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientHandler implements Runnable{
    private String name;
    private Socket socket;
    PrintWriter out = null;
    private String currentMessage = "";
    private Scanner in;
    ServerControl sc;

    boolean results;
     
    public void setResults(boolean results){
        this.results = results;
    }
    
    public ClientHandler(String name, Socket socket){
        this.socket = socket;
        this.name = name;   
    }
    
    public String getCurrentMessage(){
        //send the current message
        return currentMessage;
    }

    public void resetCurrentMessage(){
        //set the current message equal to nothing
        currentMessage = "";
    }
    
    
    @Override
    public void run() {
        System.out.println("Client is ready to Listen");
        try {
            out = new PrintWriter(socket.getOutputStream(), true);
            out.flush();
            in = new Scanner(new InputStreamReader(socket.getInputStream()));
        } catch (IOException ex) {
            System.out.println("Client is not Listening");
            ex.printStackTrace();
        }
            while(true){                
                try {
                    //listen for the message from the client
                    System.out.println("Listening for Message");
                    currentMessage = in.next();
                    System.out.println(currentMessage);
                } catch (Exception x) {
                    x.printStackTrace();
                }
            }
        }
        
    }

Main class:

import java.awt.*;

public class Main extends javax.swing.JFrame {

        public Main() {
        initComponents();
        this.setTitle("Test Taker");

        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension screenDim = toolkit.getScreenSize();
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        int mainWidth = this.getWidth(), mainHeight = this.getHeight();
        setLocation((screenDim.width - mainWidth)/2, (screenDim.height - mainHeight)/2);
        
    }

        private void ServerActionPerformed(java.awt.event.ActionEvent evt) {                                       

    ServerControl sc = new ServerControl();
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Dimension screenDim = toolkit.getScreenSize();
    int scWidth = sc.getWidth(), scHeight = sc.getHeight();

    setVisible(false);
    sc.setDefaultCloseOperation(HIDE_ON_CLOSE);
    sc.setLocation((screenDim.width - scWidth)/2, (screenDim.height - scHeight)/2);
    sc.show();
     
}                                      

private void ClientActionPerformed(java.awt.event.ActionEvent evt) {                                         
    Client ipg = new Client();
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Dimension screenDim = toolkit.getScreenSize();
    int ipgWidth = ipg.getWidth(), ipgHeight = ipg.getHeight();

    setVisible(false);
    ipg.setDefaultCloseOperation(HIDE_ON_CLOSE);
    ipg.setLocation((screenDim.width - ipgWidth)/2, (screenDim.height - ipgHeight)/2);
    ipg.show();
         
}

        public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton Client;
    private javax.swing.JButton Server;
    private javax.swing.JLabel jLabel1;
}

Results Display class:
[ICODE]import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;

public class ResultsDisplay extends JPanel {
    private int a,b,c,d,e,f;
    FileWriter fw;
    private String currentMessage = "";
    ServerSocket serverSocket = null;
    Scanner in = null;
    PrintWriter out = null;
    static final int PORT = 7;
    ArrayList <ClientHandler> arrClients = new ArrayList<ClientHandler>();
    Socket socket;
    HashMap<ClientHandler,String> list = new HashMap<ClientHandler,String>();
    boolean finished = false;
    public ResultsDisplay(){
    
    }

    public void endProgram(String name) throws IOException{
        try {
            boolean exists = (new File(name)).exists();
            //make a new file
            if(exists){
                
            }else{
                fw = new FileWriter(name);
            }
            //write the results to the file
            for(ClientHandler cl : arrClients){
                list.get(cl);
                fw.append(list.toString() + "\n");
            }
             
        } catch (IOException ex) {
        }finally{
            //close the file
            fw.close();
            //set finished to true so all other loops close
            finished = true;
            //open the file
            String[] args = {"open", name};
            Runtime.getRuntime().exec(args);
            //exit program
            System.exit(0);
        }

    }
    
    public void resetClients(){
        //iterate through clients and send message
        for(ClientHandler cl : arrClients){
            out.println("sent");
            out.println("new");
        }
    }
   
    @Override
    public void paintComponent(Graphics g){
        //draw the graw of results
        super.paintComponent(g);
        DrawResults(g);
    }
    
    public void Connect(){
        //start connection thread to listen for users
         connect.start();
         //start listener thread to listen for in and out messages
         listener.start();
    }

    Thread listener = new Thread(){
        @Override
        public void run(){
            //while program has not ended
            while(!finished){
                //add each client in hashmap add text
                for(ClientHandler c: arrClients){
                    //if the current message isnt null, add it to the list
                    if(!c.getCurrentMessage().equals("")){
                        //TODO:  you may need to parse the current message
                        SetAnswer(c.getCurrentMessage());
                        try{
                            //get the client in the hashmap
                            list.get(c);
                            //put their answer in the hashmap
                            list.put(c, currentMessage + ", ");
                        }catch(Exception e){                           
                        }
                        c.resetCurrentMessage();
                    }
                }
            }
        }
    };

    Thread connect = new Thread(){
        @Override
        public void run(){
               ClientHandler client;
            try{
                //open server socket
                serverSocket = new ServerSocket(PORT);
                while(!finished){
                    //look for users
                    socket = serverSocket.accept();
                    Scanner intest=new Scanner(socket.getInputStream());
                    //System.out.println("Message" + intest.next());
                    //instanciating clients
                    client = new ClientHandler(Client.username, socket);
                    //start client threads for messages
                    client.run();
                    //add clients to array
                    arrClients.add(client);
                    //add client to the hashmap
                    list.put(client, "");                                              
                    
                }
                //when program is finished close server socket
                serverSocket.close();
                
            }catch (IOException ex) {
                    System.out.println("Could not initiate server socket");
            }
        }
    };

    public void SetAnswer(String answer){
        if(answer.equals("a")){
            //if answer is a then add 1 to the variable a
            a += 1;
        }
        if(answer.equals("b")){
            //if answer is b then add 1 to the variable b
            b += 1;
        }
        if(answer.equals("c")){
            //if answer is c then add 1 to the variable c
            c += 1;
        }
        if(answer.equals("d")){
            //if answer is d then add 1 to the variable d
            d += 1;
        }
        if(answer.equals("e")){
            //if answer is e then add 1 to the variable e
            e += 1;
        }
        if(answer.equals("f")){
            //if answer is f then add 1 to the variable f
            f += 1;
        }
        else{
            System.out.println("could not set answer");
        }

    }

    public void ResetScores(){
        //set all scores equal to 0
        a=0;
        b=0;
        c=0;
        d=0;
        e=0;
        f=0;
    }
    
    
    public void DrawResults(Graphics g){
        //set starting y coordinate
        int y = 36;
        //set the starting number coordinate
        int numY = 665;
        String stra = "a", strb = "b", strc= "c", strd= "d", stre= "e", strf= "f";
        
        //draw the outline of the graph
        g.drawLine(24, 36, 24, 676);
        g.drawLine(24, 676, 425, 676);
        int num = 1;
        for(int i = 0; i < 40; i++){ 
            
            String str = String.valueOf(num);
            g.drawLine(19, y, 24, y);
            y += 16;
            if(num<=9){
                g.drawString(str, 10, numY);
            }
            else{
                g.drawString(str, 5, numY);
            }
            num += 1;
            numY -= 16;
        }
        //draw A/B/C/D/E/F
        g.drawString(stra, 47, 690);
        g.drawString(strb, 122, 690);
        g.drawString(strc, 198, 690);
        g.drawString(strd, 272, 690);
        g.drawString(stre, 347, 690);
        g.drawString(strf, 423, 690);
            
        //draw the results       
        g.setColor(Color.BLUE);
        g.fillRect(25, 676 - (a*16), 50, a*16);
        g.setColor(Color.MAGENTA);
        g.fillRect(100, 676 - (b*16), 50, b*16);
        g.setColor(Color.GREEN);
        g.fillRect(175, 676 - (c*16), 50, c*16);
        g.setColor(Color.CYAN);
        g.fillRect(250, 676 - (d*16), 50, d*16);
        g.setColor(Color.ORANGE);
        g.fillRect(325, 676 - (e*16), 50, e*16);
        g.setColor(Color.YELLOW);
        g.fillRect(400, 676 - (f*16), 50, f*16);

        //draw lines around results
        g.setColor(Color.BLACK);
        g.drawRect(25, 676 - (a*16), 50, a*16);
        g.drawRect(100, 676 - (b*16), 50, b*16);
        g.drawRect(175, 676 - (c*16), 50, c*16);
        g.drawRect(250, 676 - (d*16), 50, d*16);
        g.drawRect(325, 676 - (e*16), 50, e*16);
        g.drawRect(400, 676 - (f*16), 50, f*16);

    }
}
If you can do anything to help it would be much appreciated, i dont know where it is going wrong. because of some character limit issues i wasnt able to post every class.

Last edited by oracleguy; 03-28-2011 at 06:44 PM.. Reason: switched from icode to code tags
mimis40 is offline   Reply With Quote