Udp server/client, java GUI,选择题

Udp server/client, java GUI, multiple choice questions

下面你会看到我的客户端和服务器代码。

我快完成了,我的问题是当用户提交 A 问题的答案时,当服务器接收到它时,我无法通过问题协议(在服务器代码中)处理它). 显示结果,即1/3、0/3等

如果你能帮我解决这个问题,因为我已经坚持了一个星期了,试图找出为什么我不能让结果部分正常工作,我想我有某种我的问题协议中的一个主要缺陷,但我没有识别它的专业知识。

这是我的服务器代码:

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

            public class UdpServer extends Thread
            {
                //final static int port = 5600;

                public static void main(String[] args) 
                {
                    try 
                    {
                        new UdpServer().startServer();//creating an object of my class to start up the server.
                    } 
                    //catch any exceptions that might occure and print the stack.
                    catch (Exception e) 
                    {
                        System.out.println("failure: " + e.getMessage());
                        e.printStackTrace();
                    }
                }

                public void startServer() throws Exception 
                {
                    DatagramSocket serverSocket = null;//intiailise the socket to null.
                    boolean listening = true;//check for connections/
                    try 
                    {
                        serverSocket = new DatagramSocket(5600);//attach a port to the server socket we are sign in this case its the port we wanted at the start.
                        byte[] receiveStuff = new byte[1024];
                        byte[] sendStuff = new byte[1024];
                        while (listening)
                        {
                            DatagramPacket Packet = new DatagramPacket(receiveStuff,receiveStuff.length);
                            serverSocket.receive(Packet);
                            InetAddress IPAddress = Packet.getAddress();
                            int port = Packet.getPort();
                            String lineInput=null, lineOutput = null;
                            QuestionLogic questionLogic = new QuestionLogic();//creating a logic section where the questions protocol takes places, this case its called question logic.
                            lineOutput = questionLogic.processInput(null);//make the output coming from the logic side, i,e fetch whatever is happening within the logic.

                            lineInput = new String (receiveStuff, 0, Packet.getLength()); 
                            System.out.println("Server Received----"+lineInput);

                            /*if(lineInput.equals("hello"))
                            {
                                lineOutput = "Thank you for using this system";
                                System.out.println(lineOutput);
                            }*/
                            Packet.setLength(receiveStuff.length);

                            lineOutput = questionLogic.processInput(lineInput);
                            System.out.println("Server Sending----"+lineOutput);
                            sendStuff = lineOutput.getBytes();
                            Packet = new DatagramPacket(sendStuff, sendStuff.length, IPAddress, port);
                            //DatagramPacket sendPacket = new DatagramPacket(sendStuff,sendStuff.length, IPAddress, port);
                            serverSocket.send(Packet);
                            Packet.setLength(sendStuff.length);

                        }
                    } 
                    catch (IOException e) 
                    {
                        System.err.println("could not connect: " );
                        System.exit(-1);
                    }


                    serverSocket.close();
                }

                //this is where the question logic get carried out, in other word a questions protocol,.

                public static class QuestionLogic 
                {
                    private static final int Hello = 0;
                    private static final int Answer = 1;
                    private static final int Result = 2;
                    private static final int question2 = 3;
                    private static final int Result2 = 4;
                    private static final int question3 = 5;
                    private static final int Result3 = 6;

                    private int state = Hello;
                    private int res = 0;
                    private String CorrectAnswer =  null;
                    //according to the client request sort out what will be happening, in different states, goin through 3 questions returning a reply each time.
                    public String processInput(String clientRequest) 
                    {       
                        String reply = null;
                        try 
                        {
                            if(clientRequest != null && clientRequest.equalsIgnoreCase("C")) 
                            {
                                res++;
                                reply = "One"+res;
                            }
                            //these were originally for testing purposes using cmd, left in here in case in the future any further testing is required      
                            if(clientRequest != null && clientRequest.equalsIgnoreCase("Hello")) 
                            {
                                state = Hello;
                            }


                            if(clientRequest != null && clientRequest.equalsIgnoreCase("B")) 
                            {
                                res++;
                                reply = "two"+res;
                            }   

                            if(clientRequest != null && clientRequest.equalsIgnoreCase("A")) 
                            {
                                res++;
                                reply = "three"+res;
                            }

                            if(clientRequest != null && clientRequest.equalsIgnoreCase("question1")) 
                            {
                                state = Answer;
                            }

                            if(clientRequest != null && clientRequest.equalsIgnoreCase("question2")) 
                            {
                                state = question2;
                            }

                            if(clientRequest != null && clientRequest.equalsIgnoreCase("question3")) 
                            {
                                state = question3;
                            }
                            if(clientRequest != null && clientRequest.equalsIgnoreCase("Result")) 
                            {
                                state = Result3;
                            }
                            if(clientRequest != null && clientRequest.equalsIgnoreCase("exit")) {
                                return "exit";
                            }
                            //starting with a connection check to confirm server is connected to client.
                            if(state == Hello) 
                            {
                                reply = "Connected, Press Next To continue";
                                state = Answer;
                            } 
                            //we begin with the first question sent to the client.
                            else if(state == Answer) 
                            {
                                reply = "Q1: (A + B)*(A+B) \n\n A)A*A + B*B \n\n B)A*A +A*B + B*B \n\n C)A*A +2*A*B + B*B \n\n ";
                            } 
                            //check if the answer from the user is the correct one, and increment or do nothing to the result


                            else if(state == question2) 
                            {
                                reply = "Q2: (A + B)*(A - B) \n\n A) A*A + 2*B*B \n\n B) A*A - B*B\n\n C)A*A -2*A*B + B*B\n\n  ";

                            }

                            else if(state == question3) 
                            {
                                reply = "Q3: sin(x)*sin(x) + cos(x)*cos(x)\n\n A)1\n\n B)2\n\n C)3\n\n";
                            }
                            //finally we printout the result at the end for the client to see.
                            else if(state == Result3) 
                            {
                                if(res == 0)
                                {
                                    reply ="Sorry you failed 0/3";
                                }
                                if(res == 1)
                                {
                                    reply ="You got 1/3";
                                }
                                if(res == 2)
                                {
                                    reply ="You got 2/3";
                                }
                                if(res == 3)
                                {
                                    reply ="You got 3/3";
                                }
                            }
                        } 
                        catch(Exception e) 
                        {
                            System.out.println("input process failed: " + e.getMessage());
                            return "exit";
                        }
                        return reply;//we return the reply from this method to be used.
                    }
                }

            }

这是我的客户端代码:

                import javax.swing.*;//for the main components design (JFrame etc).
            import java.awt.*; //main GUI manipulation.
            import java.net.*;//for socket and network programming such as ServerSockets etc.
            import java.io.*; //for main editing utilities (inputs/outputs).
            import java.awt.event.*; //Event manipulation

            //creating my main client class.
            class UdpClient 
            {
                //constructor
                public static void main (String[] args)
                {
                    try
                    {   //create an object of the class where i can carry out my code.      
                        UdpClient c = new UdpClient();
                    }

                    catch(Exception ex)
                    {
                        System.out.println("Major Error" + ex.getMessage());
                        ex.printStackTrace();
                    }
                }


                //all public variables i would like to access through out my code.
                JFrame build;//the main frame of the client
                JLabel ans,Label; // labels for names and instructions.
                JComboBox options,request;
                JButton b1,b2;//2 buttons for next and exit.
                JTextArea txt1,txt3;//txt area for the actual questions.
                JTextField txt2;// txtfield to take in user answer.
                DatagramSocket clientSocket;//client socket.
                DatagramPacket sendPacket, receivePacket;
                byte[] sendData;
                byte[] receiveData;
                String clientMsg = null,serverMsg,lineInput;

                InetAddress IPAddress = null;//for hostname solutions.
                //the next few lines, their names explain what they are for.




                //the object we created earlier where the code will mainly be discussed.    
                UdpClient()
                {   
                    //creating the actual gui, addinng everything into the build, naming them, and setting their positions.
                    build = new JFrame ("Client");
                    Label = new JLabel();
                    Label.setText("Client Interface");
                    Label.setForeground(Color.blue);
                    Label.setBounds(300,0,400,50);
                    build.add(Label);

                    //creatin text area for the questions and setting colours and position              
                    txt1 = new JTextArea();
                    txt1.setBackground(Color.cyan);
                    txt1.setForeground(Color.blue);
                    txt1.setEditable(false);
                    txt1.setBounds(50,50,300,500);
                    build.add(txt1);

                    //creating text field for the answer display/
                    txt2 = new JTextField();
                    txt2.setEditable(false);
                    txt2.setBounds(500,450,50,50);
                    build.add(txt2);

                    /*/text area for the instructions of how to use the programme.
                    txt3 = new JTextArea("Instructions:\n\n Press Next to Begin\n\n Question Appears\n\n Select Answer From List\n\n Press Next\n\n Wait For Confirmation\n\n Press Next\n\n If Result Appears\n\n Press Exit\n");
                    txt3.setForeground(Color.red);
                    txt3.setBackground(Color.lightGray);
                    txt3.setEditable(false);
                    txt3.setBounds(400,150,200,270);
                    build.add(txt3);*/

                    ans = new JLabel("Answer");
                    ans.setBounds(400,450,100,50);
                    build.add(ans);

                    b1 = new JButton("Next");
                    b1.setBounds(500,500,100,50);
                    build.add(b1);

                    b2= new JButton("start");
                    b2.setBounds(400,500,100,50);
                    build.add(b2);



                    //creating a combo box for the user to choose answers from.
                    options = new JComboBox();
                    options.addItem("A");
                    options.addItem("B");
                    options.addItem("C");
                    options.addActionListener(new ActionListener()//adding actions listeners to the choices to add the answer of the user into the txt field answer area.
                    {
                        public void actionPerformed(ActionEvent e)
                        {
                            if(options.getSelectedItem().equals("A"))
                            {
                                txt2.setText("A");
                            }

                            if(options.getSelectedItem().equals("B"))
                            {
                                txt2.setText("B");
                            }

                            if(options.getSelectedItem().equals("C"))
                            {
                                txt2.setText("C");
                            }
                        }
                    });

                    b1.addActionListener(new ActionListener()
                    {
                        public void actionPerformed(ActionEvent ev)
                        {
                            if(ev.getSource() == b1)
                            {
                                try
                                {
                                    clientSocket = new DatagramSocket();
                                    sendData = new byte[1024];
                                    receiveData = new byte[1024];
                                    IPAddress = InetAddress.getByName("localhost");
                                    clientMsg = txt2.getText();
                                    sendData = clientMsg.getBytes();
                                    sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 5600);
                                    clientSocket.send(sendPacket);
                                    clientSocket.close();
                                }

                                catch(UnknownHostException ex1)
                                {
                                    System.err.println("no host: ");
                                    System.exit(1);
                                }

                                catch(IOException ex1)
                                {

                                    System.exit(1);
                                }   

                            }

                        }

                    });

                    request= new JComboBox();
                    request.addItem("QuestionOne");
                    request.addItem("QuestionTwo");
                    request.addItem("QuestionThree");
                    request.addItem("Result");
                    request.addActionListener(new ActionListener()//adding actions listeners to the choices to add the answer of the user into the txt field answer area.
                    {
                        public void actionPerformed(ActionEvent e)
                        {
                            if(request.getSelectedItem().equals("QuestionOne"))
                            {
                                try
                                {
                                    clientSocket = new DatagramSocket();
                                    sendData = new byte[1024];
                                    receiveData = new byte[1024];
                                    IPAddress = InetAddress.getByName("localhost");
                                    clientMsg = "question1";
                                    sendData = clientMsg.getBytes();
                                    sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 5600);
                                    clientSocket.send(sendPacket);

                                    receivePacket = new DatagramPacket(receiveData, receiveData.length);
                                    clientSocket.receive(receivePacket);

                                    serverMsg = new String (receiveData, 0, receivePacket.getLength()); 
                                    txt1.setText(serverMsg);
                                    clientSocket.close();
                                }

                                catch(UnknownHostException ex)
                                {
                                    System.err.println("no host: ");
                                    System.exit(1);
                                }

                                catch(IOException ex)
                                {

                                    System.exit(1);
                                }   
                            }   

                            if(request.getSelectedItem().equals("QuestionTwo"))
                            {
                                try
                                {
                                    clientSocket = new DatagramSocket();
                                    sendData = new byte[1024];
                                    receiveData = new byte[1024];
                                    IPAddress = InetAddress.getByName("localhost");
                                    clientMsg = "question2";
                                    sendData = clientMsg.getBytes();
                                    sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 5600);
                                    clientSocket.send(sendPacket);

                                    receivePacket = new DatagramPacket(receiveData, receiveData.length);
                                    clientSocket.receive(receivePacket);

                                    serverMsg = new String (receiveData, 0, receivePacket.getLength()); 
                                    txt1.setText(serverMsg);
                                    clientSocket.close();
                                }

                                catch(UnknownHostException ex)
                                {
                                    System.err.println("no host: ");
                                    System.exit(1);
                                }

                                catch(IOException ex)
                                {

                                    System.exit(1);
                                }   
                            }   

                            if(request.getSelectedItem().equals("QuestionThree"))
                            {
                                try
                                {
                                    clientSocket = new DatagramSocket();
                                    sendData = new byte[1024];
                                    receiveData = new byte[1024];
                                    IPAddress = InetAddress.getByName("localhost");
                                    clientMsg = "question3";
                                    sendData = clientMsg.getBytes();
                                    sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 5600);
                                    clientSocket.send(sendPacket);

                                    receivePacket = new DatagramPacket(receiveData, receiveData.length);
                                    clientSocket.receive(receivePacket);

                                    serverMsg = new String (receiveData, 0, receivePacket.getLength()); 
                                    txt1.setText(serverMsg);
                                    clientSocket.close();
                                }

                                catch(UnknownHostException ex)
                                {
                                    System.err.println("no host: ");
                                    System.exit(1);
                                }

                                catch(IOException ex)
                                {

                                    System.exit(1);
                                }   
                            }   
                            if(request.getSelectedItem().equals("Result"))
                            {
                                try
                                {
                                    clientSocket = new DatagramSocket();
                                    sendData = new byte[1024];
                                    receiveData = new byte[1024];
                                    IPAddress = InetAddress.getByName("localhost");
                                    clientMsg = "Result";
                                    sendData = clientMsg.getBytes();
                                    sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 5600);
                                    clientSocket.send(sendPacket);

                                    receivePacket = new DatagramPacket(receiveData, receiveData.length);
                                    clientSocket.receive(receivePacket);

                                    serverMsg = new String (receiveData, 0, receivePacket.getLength()); 
                                    txt1.setText(serverMsg);
                                    clientSocket.close();
                                }

                                catch(UnknownHostException ex)
                                {
                                    System.err.println("no host: ");
                                    System.exit(1);
                                }

                                catch(IOException ex)
                                {

                                    System.exit(1);
                                }   
                            }   

                        }
                    });
                    //start button
                    b2.addActionListener(new ActionListener()
                    {
                        public void actionPerformed(ActionEvent ev1)
                        {
                            if(ev1.getSource() == b2)
                            {

                                try
                                {
                                    clientSocket = new DatagramSocket();
                                    sendData = new byte[1024];
                                    receiveData = new byte[1024];
                                    IPAddress = InetAddress.getByName("localhost");
                                    clientMsg = "Hello";
                                    sendData = clientMsg.getBytes();
                                    sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 5600);
                                    clientSocket.send(sendPacket);

                                    receivePacket = new DatagramPacket(receiveData, receiveData.length);
                                    clientSocket.receive(receivePacket);

                                    serverMsg = new String (receiveData, 0, receivePacket.getLength()); 
                                    txt1.setText(serverMsg);
                                    clientSocket.close();
                                }

                                catch(UnknownHostException e)
                                {
                                    System.err.println("no host: ");
                                    System.exit(1);
                                }

                                catch(IOException e)
                                {

                                    System.exit(1);
                                }   

                            }
                        }
                    });
                    options.setBounds(450,450,50,50);
                    request.setBounds(400,150,200,270);
                    build.add(options);
                    build.add(request);

                    build.setLayout(null);//setting build layout.
                    build.setSize(700,600);//the size of the main window.
                    build.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//close when X is pressed.
                    build.setVisible(true);//enable it so it appears.
                    build.setResizable(false);//make it a fixed sized so user cant change it, e.g maximize it.

                    //a try catch, to do all the networking aspect of the client side inside of.    

                }
            }

我解决了这个问题,最后使用数据库来解决问题。