Это зависит от того, какой тип соединений вы хотите использовать, если вы помните, что в Java есть блокировка ввода-вывода (java.net.Socket
, java.net.ServerSocket
) и разблокировка ввода-вывода через каналы (java.nio.channel.SocketChannel
)
В подходе блокирования ввода / вывода каждый клиент будет иметь свою собственную обработку производителя / потребителя, вы можете иметь:
- поток, который принимает ответы, поставленные в очередь локально, и пытается отправить их на сервер
- GUI, который заботится о размещении элементов в очереди ответа
всякий раз, когда ваш потребительский поток может отправить ответ на сервер, он удаляет его из очереди
На сервере вы можете обрабатывать ответы в общем месте:
- у вас есть поток, который обрабатывает ответы, полученные от всех клиентов (вы можете накапливать их в буфере), и он помещает себя в ожидание, когда буфер пуст.
- каждое соединение от клиента имеет свой собственный поток, который получает ответы и помещает их в очередь процесса.
Этот подход безопасен, но он довольно тяжелый. Вы можете подумать об открытии соединения только на время ответа, отправить его на сервер и затем закрыть.
В противном случае вы можете просто использовать UDP (что на самом деле лучше для такого рода проблем), но вам придется подумать о способе отправки подтверждений клиентам, когда ваш сервер получает ответы.
Например:
- студент дает ответ: ответ добавляется в буфер клиента
- клиентский поток пытается отправить свой буфер через UDP
- всякий раз, когда клиент получает подтверждение для ответа, он удаляет его из буфера
- периодически пытается отправить все еще неподтвержденные ответы
На стороне сервера:
- всякий раз, когда он получает ответную дейтаграмму от клиента, накапливает ее в буфере процесса
- у вас есть поток, который обрабатывает все ответы в буфере
- сервер отправит клиенту подтверждение, чтобы предупредить, что ответ получен
Но в этом все еще нет уверенности, потому что в сети можно пропустить подтверждение.
В любом случае вы можете использовать ObjectInputStream
и ObjectOutputStream
для прямой передачи объектов между клиентами и сервером. Таким образом, вы можете думать об инкапсулированном объекте, как
class Answer
{
int studentId;
int questionId;
int answer;
}