Отправить сообщение с базового сервера на конкретный клиент

У меня есть два модуля Wi-Fi M1 и M2, которые подключаются к моей точке доступа. У меня есть телефон Android, который подключается к той же точке доступа. У меня есть сервер сокетов на моем телефоне Android, и два модуля присоединяются к серверу в качестве клиентов. Теперь мой вопрос: можно ли отправить строковое сообщение с моего телефона на модуль M1, не отправляя ничего на M2. Я хочу выбрать между клиентами для отправки сообщения. Возможно ли это даже на Java?

Хорошо, поехали.

//setting up server
ServerSocket serverSocket = new ServerSocket(8000, 0, IPaddress);

//creating a client socket to accept it
Socket clientSocket = serverSocket.accept();

Теперь я принимаю клиента в отдельном потоке, чтобы основной поток не зависал, потому что функция accept() блокируется.

Я не знаю, как создавать новый поток каждый раз, когда подключается новый клиент. Также я не знаю, как ограничить количество клиентов, которые могут подключиться. Мне нужно максимум 5 клиентов и не больше.


person David Norman    schedule 27.05.2012    source источник


Ответы (1)


Да, это возможно. Вам необходимо поддерживать отдельное соединение с каждым клиентом. Класс ServerSocket имеет функцию accept(), которая возвращает объект Socket. Этот объект представляет собой соединение между двумя точками, вашим сервером и одним клиентом. Вы можете вызывать ServerSocket.accept() несколько раз в цикле, чтобы принимать все входящие подключения. Каждый возвращаемый объект Socket будет предназначен для другого клиента.

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

Опубликуйте свой код, если у вас все еще есть проблемы.

ОБНОВЛЕНИЕ, потому что вы добавили код в вопрос: см. Android Документация о создании тем. Это будет много читать помимо этого поста в stackoverflow.

Что касается принятия соединений и запуска потоков, просто сделайте это в цикле:

for(int i = 0; i<5; i++){
    clientSocket = serverSocket.accept();
    // start a new thread, passing it the clientSocket as an argument
}

Другие, возможно, полезные ссылки: https://developer.android.com/resources/articles/painless-threading.html https://developer.android.com/guide/topics/fundamentals/processes-and-threads.html

person kaz    schedule 27.05.2012
comment
о боже ты просто гений. Я сам не мог бы выразить это лучше. Я знал, что это возможно, просто не знал, как это реализовать. У меня есть код, но я не знаю, как его сюда вставить. когда я копирую и вставляю, он отображается как мусор. Как мне публиковать коды, как это делают другие люди, при переполнении стека ?? - person David Norman; 28.05.2012
comment
поставьте 4 пробела перед каждой строкой вашего кода. Кнопка {} над вашим сообщением, когда вы редактируете его, попытается сделать это автоматически, но это не всегда срабатывает. Под полем редактирования вашего поста находится предварительный просмотр. Кроме того, если мой ответ решил вашу проблему, не стесняйтесь щелкнуть галочку рядом с ним, чтобы указать, что проблема решена, и дать мне бонус за правильный ответ. - person kaz; 28.05.2012
comment
милая. Ты мужчина. плохо дать, что выстрел. Вернитесь с кодом через 15 минут. - person David Norman; 28.05.2012
comment
Я не уверен, но кто-то удалил мой пост под названием «Обновление 2». Во всяком случае, я это сделал, но все еще не могу отправить сообщение клиенту, который подключается последним. Хорошо, еще вопрос, могу ли я сделать что-то подобное без связи сервер-клиент. Я имею в виду, что мой телефон и два модуля подключены к моей точке доступа, которая является локальной сетью. Есть ли способ отправить сообщение с моего телефона на любой из модулей, используя его IP-адрес, который я получаю от своего маршрутизатора? - person David Norman; 28.05.2012
comment
Это действительно тема для другого вопроса на другом сайте stackexchange, но ваши хосты (любой компьютер, подключенный к вашей локальной сети, например, ваш рабочий стол, ноутбук или телефон, является хостом. Modules - это вводящий в заблуждение термин, как вы его используете) будет необходимо, чтобы на них работал сервер, прослушивающий входящие сообщения. openSSH — отличный и безопасный инструмент для этого в Linux, а протокол ssh можно использовать практически в любой современной ОС. Если у вас возникли проблемы с отправкой сообщений кодом не тому клиенту, опубликуйте код, и мы поможем вам найти причину. - person kaz; 28.05.2012
comment
сладкий аз каз. Я в середине своих экзаменов, поэтому не могу продвинуться с кодом. Я возобновлю свой проект во вторник. Кроме того, под модулями я подразумеваю модули Wi-Fi. Я заказал два модуля Wi-Fi и попытался подключить их к двум домашним устройствам. Я хочу включать/выключать эти приборы с помощью телефона. - person David Norman; 28.05.2012