Мне нужно создать тестовую систему клиент-сервер, которая выполняет следующее: сервер отправляет тест (в 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 появится после этого, когда я нажимаю ответы, чтобы отправить их обратно на сервер, чтобы сервер мог проверить его и отправить обратно клиенту, который отображает сорт а потом сокет сервера закрыть? как это сделать?
Как это выглядит