Проблема с клиентским сервером Swing - PullRequest
0 голосов
/ 05 мая 2020

Мне нужно создать тестовую систему клиент-сервер, которая выполняет следующее: сервер отправляет тест (в xml) клиенту, клиент отображает тест и отправляет ответы, а затем отправляет ответы обратно на сервер, где сервер проверяет ответы и вернуть результат с оценкой клиенту и отобразить его. Пока что я сделал несколько вещей, но на самом деле это мой первый раз, когда я что-то делаю с Swing, и у меня довольно плохой опыт работы с сокетами. Я вставлю то, что сделал до сих пор, и попытаюсь объяснить, какие у меня проблемы.

public class ServerSide {
    private static ServerSocket serverSocket = null;
    private static Socket socket = null;

    private OutputStream outputStream;
    private InputStream inputStream;
    private File file = new File("GradingSystemTest.xml");

    private void startServer() {
        try {
            //opening socket on *.8080
            serverSocket = new ServerSocket(8080);
            System.out.println("Server started.");

            //listening for connection!
            socket = serverSocket.accept();
            System.out.println("Client connected.");

            //sending xml file to the client
            sendFile(file);
        } catch (IOException e) {
            System.out.println(e);
        }
    }

    public void sendFile(File file) {
        try {
            byte[] bytes = new byte[16 * 1024];
            inputStream = new FileInputStream(file);
            outputStream = socket.getOutputStream();
            int count;
            while((count = inputStream.read(bytes)) > 0){
                outputStream.write(bytes, 0, count);
            }

        } catch (IOException e) {
            System.out.println("Re-open application.");
        } catch (NullPointerException npe) {
            System.out.println("Server socket is closed.");
        }
    }

    public static void main(String[] args) {
        ServerSide serverSide = new ServerSide();
        serverSide.startServer();
    }
}

и клиентская часть

public GradingClient() { }

private void parseXML(InputStream inputStream) throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();

    Document doc = builder.parse(inputStream);
    doc.getDocumentElement().normalize();

    NodeList nList = doc.getElementsByTagName("question");
    System.out.printf("There are %d questions. \n", nList.getLength());
    System.out.println("----------------------------");
    showXML(nList, doc);
}

public void showXML(NodeList nList, Document doc) {
    for (int i = 0; i < nList.getLength(); i++) {
        Node nNode = nList.item(i);
        questionTitles.add((i + 1) + "." + doc.getElementsByTagName("title").item(i).getTextContent()
                .replaceAll("\\s+", " "));
        addLabel(questionTitles.get(i));
        buttonGroup = new ButtonGroup();
        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement = (Element) nNode;
            for(int j = 0; j < eElement.getElementsByTagName("answer").getLength(); j++) {
                char answerChar = (char) ('A' + j);
                String actionName = String.valueOf(answerChar);
                answer = (" " + answerChar + "." + eElement.getElementsByTagName("answer").item(j).getTextContent().replaceAll("\\s+", " "));
                JRadioButton jradioButton = addRadioButton(answer, actionName);
                buttonGroup.add(jradioButton);
                jRadioButtons.add(jradioButton);
            }
        }
    }
    jButton = new JButton("Submit");
    panel.add(jButton);
}

public void connectToServer() {
    try {
        socket = new Socket("localhost", 8080);
        connectionLabel.setText("Connected to server.");
        panel.add(connectionLabel);
        InputStream in = socket.getInputStream();
        parseXML(in);
    } catch (IOException e) {
        connectionLabel.setText("Server is down.");
    } catch (SAXException | ParserConfigurationException e) {
        e.printStackTrace();
    }
}

public void addLabel(String questionTitle) {
    panel.add(new JLabel(questionTitle));
}

public JRadioButton addRadioButton(String answerTitle, String actionName) {
    JRadioButton jRadioButton = new JRadioButton(answerTitle);
    jRadioButton.setActionCommand(actionName);
    panel.add(jRadioButton);
    return jRadioButton;
}

public void createGUI() {
    JFrame frame = new JFrame("Grading System");
    connectToServer();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    frame.add(panel);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    frame.setContentPane(panel);
    frame.pack();

    frame.setSize(1000, 1000);
    frame.setVisible(true);
}

public static void main(String[] args) {
    GradingClient gradingClient = new GradingClient();
    gradingClient.createGUI();
}

}

Итак, я получил несколько проблем, и они следующие: когда я запускаю сервер и клиент, я получаю xml, и клиент отображает его правильно, но только когда сокет сервера закрывается, он может отображать GUI, и он закрывается сразу, когда я открываю клиент. Итак, мой вопрос заключается в следующем: как я могу оставить серверный сокет открытым и GUI появится после этого, когда я нажимаю ответы, чтобы отправить их обратно на сервер, чтобы сервер мог проверить его и отправить обратно клиенту, который отображает сорт а потом сокет сервера закрыть? как это сделать?

Как это выглядит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...