Что такое socket android

Использование сокетов в Android

Создано большое количество приложений как для Android, так и для других ОС, которые взаимодействуют друг с другом с помощью установления соединенией по сети. К таким приложениям относятся, например, мессенджеры социальных сетей WhatsApp, Viber. Как правило, для установления соединения между такими приложениями используются сокеты.

Сокет (socket) — это интерфейс, позволяющий связывать между собой программы различных устройств, находящихся в одной сети. Сокеты бывают двух типов: клиентский (Socket) и серверный (ServerSocket). Главное различие между ними связано с тем, что сервер «открывает» определенный порт на устройстве, «слушает» его и обрабатывает поступающие запросы, а клиент должен подключиться к этому серверу, зная его IP-адрес и порт. В Android сокеты для передачи данных используют по умолчанию протокол TCP/IP, важной особенностью которого является гарантированная доставка пакетов с данными от одного устройства до другого.

Особенности использования сокетов

Что важно знать при использовании сокетов в Android ?

  • соединения сокетов отключаются при переходе устройства в спящий режим;
  • чтобы не «рвать» соединение при наступлении спящего режима в устройстве можно использовать сервис;
  • для использования интернет-сети необходимо Android-приложению предоставить нужные права в манифесте.

Для определения прав в манифесте необходимо в файл AndroidManifest.xml добавить следующую строку :

Теперь android-приложения будет иметь доступ к сети.

Далее в статье рассмотрим пример клиент-серверного сокетного соединения с передачей сообщения. Функции клиента будет выполнять android-приложение. Серверное java-приложение выполним в IDE Eclipse с использованием пакета concurrent. В конце страницы можно скачать оба приложения.

Клиентский android-сокет

Интерфейс andriod-приложения представлен на следующем скриншоте. Форма приложения включает поле ввода текстового сообщения и кнопки установления соединения сервером, передачи сообщения и закрытия соединения.

Клиентское приложение создадим из двух классов : класс взаимодействия с серверным сокетом Connection и класс стандартной активности MainActivity.

Класс Connection

Класс взаимодействия с сервером Connection получает при создании (через конструктор) параметры подключения : host и port. Методы Connection вызываются из активности и выполняют следующие функции :

Метод Описание
openConnection Метод открытия сокета/соединения. Если сокет открыт, то он сначала закрывается.
closeConnection Метод закрытия сокета
sendData Метод отправки сообщения из активности.
finalize Метод освобождения ресурсов

Листинг Connection

Класс активности MainActivity

В активности MainActivity определены параметры сервера : host, port. Помните, что IP-адрес сервера для Вашего android-примера не может быть localhost (127.0.0.1), иначе Вы будете пытаться связаться с сервером внутри Andriod-системы. Кнопки интерфейса связаны с методами обращения к классу Connection. Кнопки отправки сообщения mBtnSend и закрытия соединения mBtnClose с сервером блокируются при старте приложения. После установления соединения с сервером доступ к кнопкам открывается.

Листинг активности

Методы управления сокетным соединением

Ниже представлены методы обработки событий, связанных с нажатием кнопок интерфейса. Обратите внимание, что подключение к серверу выполняется в отдельном потоке, а открытие доступа к кнопкам в основном потоке, для чего вызывается метод runOnUiThread. Для отправки сообщения серверу также создается отдельный поток.

Читайте также:  Viperfx андроид без рут прав

Серверное приложение

Серверное приложение включает 2 класса : Server и ConnectionWorker. Серверный класс Server будет выполнять обработку взаимодействия с клиентом с использованием ConnectionWorker в отдельном потоке. Конструктор ConnectionWorker в качестве параметра получает объект типа Socket для чтения сообщений клиента из потока сокета.

Листинг ConnectionWorker

ConnectionWorker получает входной поток inputStream из клиентского сокета и читает сообщение. Если сообщение отсутствует, т.е. количество прочитанных байт равно -1, то это значит, что соединение разорвано, то клиентский сокет закрывается. При закрытии клиентского соединения входной поток сокета также закрывается.

Серверный класс

Серверный класс Server создадим с использованием многопоточного пакета util.concurrent. На странице описания сетевого пакета java.net и серверного ServerSocket был приведен пример серверного модуля с использованием обычного потока Thread, при работе с которым необходимо решать задачу его остановки : cтарый метод Thread.stop объявлен Deprecated и предан строжайшей анафеме, а безопасная инструкция Thread.interrupt безопасна, к сожалению, потому, что ровным счетом ничего не делает (отправляет сообщение потоку : «Пожалуйста, остановись»). Услышит ли данный призыв поток остается под вопросом – все зависит от разаработчика.

Чтобы иметь возможность остановить сервер «снаружи» в серверный класс Server включим 2 внутренних реализующих интерфейс Callable класса : CallableDelay и CallableServer. Класс CallableDelay будет функционировать определенное время, по истечении которого завершит свою работу и остановит 2-ой серверный поток взаимодействия с клиентами. В данном примере CallableDelay используется только для демонстрации остановки потока, организуемого пакетом util.concurrent.

Листинг CallableDelay

CallableDelay организует цикл с задержками. После завершения последнего цикла cycle поток завершает цикл, останавливает вторую задачу futureTask[1] и закрывает сокет. В консоль выводится соответствующее сообщение.

Листинг CallableServer

Конструктор CallableServer в качестве параметров получает значение открываемого порта для подключения клиентов. При старте (метод call) создается серверный сокет ServerSocket и поток переходит в режим ожидания соединения с клиентом. Остановить поток можно вызовом метода stopTask, либо завершением «задачи» типа FutureTask с данным потоком.

При подключении клиента метод serverSoket.accept возвращает сокет, который используется для создания объекта ConnectionWorker и его запуска в отдельном потоке. А сервер (поток) переходит к ожиданию следующего подключения.

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

Листинг серверного класса Server

Cерверный класс Server создает два потоковых объекта (callable1, callable2), формирует из них две задачи futureTask и запускает задачи на выполнение методом execute исполнителя executor. После этого контролируется завершение выполнение обоих задач методом isTasksDone. При завершении выполнения обеих задач завершается также и цикл работы executor’а.

Два внутренних описанных выше класса (CallableDelay, CallableServer) не включены в листинг.

Источник

Native Socket.IO and Android

In this tutorial well learn how to create a chat client that communicates with a Socket.IO Node.JS chat server, with our native Android Client! If you want to jump straight to the code, it’s on GitHub. Otherwise, read on!

Introduction#

To follow along, start by cloning the repository: socket.io-android-chat.

The app has the following features:

  • Sending a message to all users joining to the room.
  • Notifies when each user joins or leaves.
  • Notifies when an user start typing a message.
Читайте также:  Обычный рабочий стол для андроида

Socket.IO provides an event-oriented API that works across all networks, devices and browsers. It’s incredibly robust (works even behind corporate proxies!) and highly performant, which is very suitable for multiplayer games or realtime communication.

Installing the Dependencies#

The first step is to install the Java Socket.IO client with Gradle.

For this app, we just add the dependency to build.gradle :

We must remember adding the internet permission to AndroidManifest.xml .

Now we can use Socket.IO on Android!

Using socket in Activity and Fragment#

First, we have to initialize a new instance of Socket.IO as follows:

IO.socket() returns a socket for http://chat.socket.io with the default options. Notice that the method caches the result, so you can always get a same Socket instance for an url from any Activity or Fragment. And we explicitly call connect() to establish the connection here (unlike the JavaScript client). In this app, we use onCreate lifecycle callback for that, but it actually depends on your application.

Emitting events#

Sending data looks as follows. In this case, we send a string but you can do JSON data too with the org.json package, and even binary data is supported as well!

Listening on events#

Like I mentioned earlier, Socket.IO is bidirectional, which means we can send events to the server, but also at any time during the communication the server can send events to us.

We then can make the socket listen an event on onCreate lifecycle callback.

With this we listen on the new message event to receive messages from other users.

This is what onNewMessage looks like. A listener is an instance of Emitter.Listener and must be implemented the call method. Youll notice that inside of call() is wrapped by Activity#runOnUiThread() , that is because the callback is always called on another thread from Android UI thread, thus we have to make sure that adding a message to view happens on the UI thread.

Managing Socket State#

Since an Android Activity has its own lifecycle, we should carefully manage the state of the socket also to avoid problems like memory leaks. In this app, we’ll close the socket connection and remove all listeners on onDestroy callback of Activity.

Calling off() removes the listener of the new message event.

Further reading#

If you want to explore more, I recommend you look into:

Other features of this app. They are just implemented with emit() , on() and off() .

Источник

Русские Блоги

Введение в Android Socket и примеры

Введение в Android Socket и примеры

Функция сокета:

Socket используется для описания IP-адреса и порта, а также для связи

Работа сокета:

  1. Подключиться к удаленной машине
  2. отправить данные
  3. Получать данные
  4. Закройте соединение
  5. Связывающий порт
  6. Отслеживайте поступление данных
  7. Получать соединения с удаленных машин на привязанных портах

Примечание: и сервер, и клиент должны реализовать Socket, но реализация отличается

Клиент: для подключения к удаленному компьютеру, отправки данных, получения данных и закрытия соединения.

Сервер: привязка портов, отслеживание поступления данных и получение подключений от удаленных машин на привязанных портах.

Схема модели связи:

Возьмем для примера TCP-связь

Читайте также:  Honor 8x обход гугл аккаунта 10 андроид плюско

Клиентский сокет

Клиент может использовать конструктор Socket для подключения к указанному серверу, мы обычно используем следующие два метода построения

  • Socket (InetAddress / String remoteAddress, int port); Создайте сокет, подключенный к указанному удаленному хосту и удаленному порту, без указания локального адреса и порта, поэтому используйте IP-адрес по умолчанию локального хоста и используйте порт, динамически выделяемый системой
  • Socket (InetAddress / String remoteAddress, int port, InetAddress localAddress, int localport); Создайте сокет для подключения к удаленному хосту и удаленному порту и укажите локальный IP-адрес и порт, подходящие для локальных нескольких IP-адресов.

Важные методы клиентского Socket:

public InputStream getInputStream () // Чтение данных сокета

public OutputStream getOutputStream () // Записываем данные в Socket

public Synchronized void close () // Закрываем сокет

ServerSocket:

Обычно используемые методы построения сервера:

  • ServerSocket (int port); Создайте ServerSocket с указанным портом, и количество очередей в это время равно 50
  • ServerSocket (int port, int backlog); // Создаем ServerSocket с указанным портом и количеством очередей
  • ServerSocket (int port, int backlog, InetAddress localaddress); // Когда машина имеет несколько IP-адресов, вы можете вызвать этот конструктор, чтобы указать IP-адрес, порт и количество очередей, которые необходимо привязать

Важные методы ServerSocket

public Socket accept (); Дождитесь запроса клиента и верните экземпляр Socket.

Метод приложения: мы можем управлять информацией, передаваемой через экземпляр Socket, возвращаемый методом accept ().

public void close (); закрывать ServerSocket сервера обычно не

Этапы реализации сервера:

  1. Через ServerSocket (int port); создать ServerSocket с указанным портом
  2. Вызов метода Accept (), ожидая запроса клиента
  3. В соответствии с экземпляром Socket, возвращенным методом Accept (), вызовите методы getInputStream () и getOutputStream () Socket для получения данных и записи данных.
  4. Вызовите метод close (), чтобы закрыть экземпляр Socket

PS1: рекомендуется поместить ServerSocket в отдельный поток для обработки, потому что фактический проект должен обрабатывать много клиентских запросов, мы не можем все ждать клиентских запросов в основном потоке, а затем обрабатывать

PS2: для запуска непосредственно на ПК программе не нужно создавать проект Android, мы напрямую используем Eclipse для создания проекта JAVA, а затем запускаем программу, после чего запускается служба, мы можем запустить клиентский Socket.

Этапы реализации клиента:

1. Объявите разрешения в файле AndroidManfest.xml: доступ в сеть

uses-permission android :name= «android.permission.INTERNET»/>

2. Реализуйте поток в Activity, чтобы запустить Socket. Невозможно определить сеть доступа к сокету в потоке пользовательского интерфейса

3. Используйте Socket (String dstName, int port); чтобы создать Socket, указав IP-адрес хоста и порт.

4. Вызовите методы getInputStream () и getOutputStream () из Socket, чтобы получить данные и записать данные.

5. Вызовите close (), чтобы закрыть соединение.

Чтобы проверить: я определил в предыдущем коде сервера:

Затем нам нужно получить данные на стороне клиента и отобразить их, затем мы определяем TextView в файле макета XML и получаем компонент в бизнес-коде JAVA. Когда сообщение с сервера получено, мы устанавливаем содержимое TextView на сервер. Контент для нас:

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

Источник

Оцените статью