Отправка данных и команд с устройства на устройство в локальной сети

В моем приложении мне нужно подключить несколько (клиентских) устройств к одному (серверному) устройству. Мне нужно, чтобы он работал в локальной сети, поэтому нет удаленного сервера. Требования:

Должны быть:

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

Должен иметь:

  • возможность отправлять большой набор данных (изображения и т. д.) от клиентов на сервер
  • возможность шифрования всех данных и команд коротким паролем

Мой googlefu не помогает мне в этом поиске, мне не хватает хороших условий поиска. То, что я прошу, — это не какой-то код, я прошу совета о том, какую технологию использовать и выполнимо ли это вообще в Android. Некоторые хорошие статьи или учебные пособия очень приветствуются.


person David Corsalini    schedule 24.11.2013    source источник
comment
Android предоставляет базовую непривилегированную сеть сокетов в стиле unix, поэтому это выполнимо с клиентами Android и любой серверной ОС. Практически вам нужно будет использовать сеть Wi-Fi (которая может иметь некоторое влияние на батарею), как если бы вы хотели использовать подключения к мобильной сети клиентов, вам нужно было бы сделать свой сервер видимым во внешнем Интернете. Предполагая Wi-Fi, вы можете упростить обнаружение, запустив сервер на машине, назначенной DHCP в качестве шлюза (даже если он отказывается направлять трафик наружу), или запустив локальный DNS. Но есть реализации протоколов обнаружения для Android.   -  person Chris Stratton    schedule 24.11.2013


Ответы (1)


Я бы предложил использовать реализацию сокета клиент-сервер. Вы можете выполнить IP-трансляцию, чтобы ваш сервер отвечал определенным клиентам. После получения первоначального ответа вы можете передавать данные любым удобным для вас способом.

В основном это сводится к:

  • Клиент создает сокет, подключающийся к широковещательному IP-адресу на заданном порту, и прослушивает входящие соединения.
  • Сервер прослушивает этот порт и отвечает на любые входящие соединения.
  • Клиент получает ответ от сервера и отвечает подробностями о своей личности клиента.
  • Любые другие данные передаются через уже установленное сокетное соединение.

Имейте в виду, что, используя сокет, вы используете пустую IP-датаграмму и просто предоставляете ее тело в необработанных двоичных данных. Это означает, что вам придется вручную написать свой протокол, чтобы справиться с типами запросов и ответов, отброшенными пакетами и любыми другими ограничениями IP. Вы можете поискать уровень реализации TCP или что-то более сложное для ваших целей.

person Paul Lammertsma    schedule 24.11.2013
comment
Это, вероятно, будет принимать форму UDP-трафика, а не необработанных IP-пакетов, тем более что с последними могут возникнуть проблемы с разрешениями. - person Chris Stratton; 24.11.2013
comment
Да, я исправляюсь. Java Сокеты используют TCP, тогда как DatagramSockets — это UDP. - person Paul Lammertsma; 24.11.2013
comment
Очень важно, как указал Крис, это будет работать только при подключении к Wi-Fi! - person Paul Lammertsma; 24.11.2013