Как я могу отправить клиентские ответы (на вопрос) на сервер, используя JAVA? - PullRequest
1 голос
/ 02 апреля 2010

Как я могу отправить ответы пользователя компьютера на стороне клиента (на вопрос с несколькими вариантами ответов) на сервер, используя JAVA

  1. У меня есть централизованный сервер и около 1000 клиентских систем.
  2. В этих 1000 системах учащиеся проходят тесты с несколькими вариантами ответов одновременно (примерно через 2 часа).
  3. Теперь я должен отправить все эти ответы на эти вопросы на сервер в асинхронной многопоточной очереди, когда студент отвечает на каждый вопрос (все 1000 студентов)
  4. Кроме того, клиент должен ждать, если соединение с сервером является сбой, в этом случае студенты должны иметь возможность продолжать сдавать экзамен / экзамен. Когда я получаю соединение, эти ответы в очереди должны быть отправлены на сервер системы.

Как я могу решить эту проблему? Пожалуйста, предложите / помогите мне в этом.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2010

Это зависит от того, какой тип соединений вы хотите использовать, если вы помните, что в Java есть блокировка ввода-вывода (java.net.Socket, java.net.ServerSocket) и разблокировка ввода-вывода через каналы (java.nio.channel.SocketChannel)

В подходе блокирования ввода / вывода каждый клиент будет иметь свою собственную обработку производителя / потребителя, вы можете иметь:

  • поток, который принимает ответы, поставленные в очередь локально, и пытается отправить их на сервер
  • GUI, который заботится о размещении элементов в очереди ответа

всякий раз, когда ваш потребительский поток может отправить ответ на сервер, он удаляет его из очереди

На сервере вы можете обрабатывать ответы в общем месте:

  • у вас есть поток, который обрабатывает ответы, полученные от всех клиентов (вы можете накапливать их в буфере), и он помещает себя в ожидание, когда буфер пуст.
  • каждое соединение от клиента имеет свой собственный поток, который получает ответы и помещает их в очередь процесса.

Этот подход безопасен, но он довольно тяжелый. Вы можете подумать об открытии соединения только на время ответа, отправить его на сервер и затем закрыть.

В противном случае вы можете просто использовать UDP (что на самом деле лучше для такого рода проблем), но вам придется подумать о способе отправки подтверждений клиентам, когда ваш сервер получает ответы.

Например:

  • студент дает ответ: ответ добавляется в буфер клиента
  • клиентский поток пытается отправить свой буфер через UDP
  • всякий раз, когда клиент получает подтверждение для ответа, он удаляет его из буфера
  • периодически пытается отправить все еще неподтвержденные ответы

На стороне сервера:

  • всякий раз, когда он получает ответную дейтаграмму от клиента, накапливает ее в буфере процесса
  • у вас есть поток, который обрабатывает все ответы в буфере
  • сервер отправит клиенту подтверждение, чтобы предупредить, что ответ получен

Но в этом все еще нет уверенности, потому что в сети можно пропустить подтверждение.

В любом случае вы можете использовать ObjectInputStream и ObjectOutputStream для прямой передачи объектов между клиентами и сервером. Таким образом, вы можете думать об инкапсулированном объекте, как

class Answer
{
   int studentId;
   int questionId;
   int answer;
}
0 голосов
/ 02 апреля 2010

Во-первых, сервер должен прослушивать определенный порт для определенных запросов. Наиболее простым выбором будет веб-сервер, прослушивающий HTTP-запросы на порту 80. Для этого вы можете использовать Apache Tomcat в качестве веб-сервера и сервлет-контейнера Java и создать Java-сервлет , который прослушивает определенный url-pattern.

Затем в своем клиентском приложении вы можете использовать java.net.URLConnection для запуска HTTP-запроса к сервлету. Вы можете использовать параметры запроса для отправки информации сервлету. Э.Г.

String param1 = URLEncoder.encode("param1", "UTF-8");
String param2 = URLEncoder.encode("param2", "UTF-8");
String query = String.format("param1=%s&param2=%s", param1, param2);
String servleturl = "http://example.com/context/servlet";

// To fire GET request, do so:
URLConnection connection = new URL(servleturl + "?" + query).openConnection;
InputStream response = connection.getInputStream();

// Or, to fire POST request, do so:
URLConnection connection = new URL(servleturl).openConnection;
connection.setDoOutput(true);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
writer.write(query.getBytes("UTF-8"));
writer.close();
InputStream response = connection.getInputStream();

В сервлете, чтобы собрать параметры из запроса GET, реализуйте doGet() следующим образом:

String param1 = request.getParameter("param1");
String param2 = request.getParameter("param2");

Для POST запросов, сделайте то же самое в doPost().

Надеюсь, это поможет.

...