Это что-то вроде «дальнейшего развития» к вопросу, который я задал некоторое время назад ... Теперь я лучше разбираюсь в сокетах и у меня есть некоторый рабочий код, но мне нужно его улучшить ...
Хорошо, поэтому в настоящее время у меня работает многоадресная рассылка UDP для отправки коротких строк текста из приложения Java-сервера на несколько телефонов Android (которые потенциально могут стать несколькими сотнями телефонов Android).В большинстве случаев это работает нормально, но, как правило, оно теряет нечетную строку на нечетном телефоне, и случайным образом он просто потерпит полную потерю за короткий промежуток времени, и ни один из них ничего не получит, что может немного расстраивать.
Поскольку, как я понимаю, нет возможности вещать по TCP - моя идея состоит в том, чтобы телефоны изначально «подключались» к серверному приложению с помощью ServerSocket .Это ничего не даст, кроме как собрать IP-адреса клиентов, которые должны храниться в Set<InetAddress>
под названием клиентов .Затем я захочу перебрать эти адреса и отправить строку на каждый телефон отдельно - , но Я не хочу блокировать код и не хочу тратить вечно на ожидание отправки, если, скажем,телефон отключился и не может / не принимает соединения.Эта информация должна поступить на все телефоны в течение нескольких секунд после начала отправки (даже с 2-300 клиентами).
Мой начальный код указан ниже, и у меня есть следующие вопросы:
- Достаточно ли этого кода в одном потоке?
- Будет ли современный ЦП использовать несколько потоков с равномерно распределенным набором адресов (скажем, 4 потока?)
- Является ли (как я полагаю) плохой идеей вращать каждое соединение / отправлять в своем собственном потоке?
- Позволяет ли установка таймаута сокета потоку работать через свой список быстрее?Или это вызовет проблемы?
- Если настройка времени ожидания сокета является хорошей идеей, то какое время имеет смысл?Или мне нужно просто проверить, чтобы понять это правильно?
Заранее спасибо за любую помощь, которую вы, ребята, можете предоставить ...
for (InetAddress client : clients) {
try {
Socket sendQuestionSocket = new Socket(client, portSend);
// Theory: 50 milliseconds is enough to connect, and could allow 200 clients
// to get their questions in around 10 seconds. Maybe?
sendQuestionSocket.setSoTimeout(50);
PrintWriter outStream = new PrintWriter(sendQuestionSocket.getOutputStream());
outStream.println(question.toString());
outStream.flush(); // Do I need this line?
sendQuestionSocket.close();
outStream.close();
} catch (InterruptedIOException e) {
logger.log(Level.WARNING, "Couldn't connect in time... passing this one over");
e.printStackTrace();
} catch (UnknownHostException e) {
logger.log(Level.SEVERE, "Unable to find that client");
e.printStackTrace();
} catch (IOException e) {
logger.log(Level.SEVERE, "Unable to create question sending port");
e.printStackTrace();
}
}