Давно не приходилось работать с сокетами, а когда приходилось как-то небыло особо сложных задач которые бы выходили за пределы того что нельзя было нагуглить. Сегодня в статье я хочу расказать про элементарнейшее из работы с сокетами, сегодня я раскажу про получение эха с сервера каждый раз когда мы отправляем туда данные. Я написал небольшой скрипт который возвращает эхо нам на запрос, и написал небольшую программку которая отправляет сообщение соккету. Дальше если захотите, можно будет сделать уже чат по этому же принципу или же какую-то работу приложения через сокеты в real-time.
Для начала мы начнем с написания сервера. Он у нас будет написан на NodeJS и хоститься будет на Heroku. Для начала нам нужно зарегистрироваться на heroku, сделать это можно тут. Дальше после регистрации вам откроется страница помощи, на которой вам будет предложено создать первый проект в этом сервисе, если же вы случайно пропустили его то вот детальная инструкция как настроить heroku для работы с NodeJS. Вся работа с heroku, заливка, деплой и т.д. происходит один в один как работа с git. Вы создаете репозиторий на heroku и потом заливаете туда ваши файлы, и сразу после заливки оно на автомате начинает деплоить то что вы залили.
Так же вам нужно настроить NodeJS на компьютере, так как перед заливкой на сервер нужно проверить код продеплоив его у себя на локальной машине, проверить рабочий ли он и работает ли он верно. Скачать его можно на официальном сайте тут. Там же есть документация на русском языке как с ним работать, вся работа работа происходит через консоль с помощью пары команд.
После инсталяции и настройки всего этого добра давайте начнем педалить. Если вы прошли туториал после регистрации, у вас должны были остаться файлы package.json, index.js и index.html. Нам они нужны, в них мы будем писать наши команды и код. Для начала давайте рассмотрим index.js и index.html. Эти два файла у нас являются мозгом и лицом нашего сервера, в index.js мы будем принимать какое-то сообщение от клиента, и отправлять ответ ему же в виде эха — то есть то же сообщение что мы прислали. В index.html я хотел выводить то, что нам присылает сервер, но потом передумал ибо это надо сильно заморачиваться и писать много лишнего кода для рассинхронизации сокетов которые принимает сервер… По этому я оставил только эхо которое будет возвращаться обратно клиенту.
index.js
Что же у нас тут написано? Ну для начала мы подключили библиотеку ws что расшифровывается как web socket, а нужен он нам для работы с сокетами, очевидно. Дальше мы подключили библиотеку http и express для того что бы наше приложение умело работать с http и express для создания слушателя определенного порта, в нашем случае это порт 5000.
Ниже мы создали сервер который будет обеспечивать нам эхо и прописали наш порт который мы будем прослушивать для получения сообщений. Ниже создаем сокет и указываем какой сервер будем слушать, в нашем случае это наш heroku.
Дальше идет метод on в котором мы указываем параметер который говорит что нам делать по ws.on('connection'), я прописал в нем что мы должны принимать сообщения с помощью ws.on('message') — если они есть, и отправляем эхо обратно с приставкой «Server received:», и ws.on('close') — если мы закрыли страницу или вышли из приложения, мы отключаем в нем все наши таймеры и так далее.
Дальше дело за мордой, у нас она будет простая, но если сильно захочется можно в нее что угодно подключить, хоть целый сайт сверстать.
index.html
Тут все тривиально, думаю даже не стоит объяснять, просто выводим текст на странице.
Ну и дальше нас интересует package.json в котором у нас указывается что компилировать, где, с какой версией и т.д. Это такой, своеобразный файл настроек сервера для компиляции.
package.json
Подключаем socketio для работы с сокетами, указываем версию и какой файл нам компилировать этой библиотекой.
Дальше загружаем это все на хероку.
Дальше вы должны увидеть долгую и длинную простыню команд которые будут деплоить ваш код на сервере, и в итоге это все должно кончится и вы должны увидеть что-то на подобии такого.
После этого всего написав в командной строке
heroku open
, вы должны увидеть надпись «It's just stub for Socket Example» которая у нас была прописана в index.html. Если же этого нету значит где-то какая-то ошибка, подеплойте код на компютере, с помощью команды node index.js
, оно покажет вам ошибки или же скомпилирует и запустит сервер.Дальше нам нужно написать программу, она у нас будет очень простой — один экран на нем одно поле для ввода и кнопка для отправки сообщений, и ниже текстовое поле которое будет выводить эхо с сервера.
После создания проекта нам нужно подключить несколько библиотек, первая по старинке это ButterKnife, я как вы поняли везде ее пихаю, а вторая SocketIO которая помогает работать с сокетами.
app/build.gradle
Вот такая фигня. Библиотеки мы подключили, теперь еще надо добавить в манифест пермишен для доступа в интернет.
AndroidManifest.xml
Тут как видно мы добавили два пермишена, первый для доступа в интернет, а второй на проверку доступа к сети в интернет.
Дальше давайте рассмотрим разметку нашей activity_main.
activity_main.xml
Как я и писал выше, у нас тут будет три элемента, edittext, textview и кнопка. Далее опишем их работу этих элементов в нашей активити.
MainActivity.java
И что же мы тут имеем. Для начала мы указываем хост к которому будем подключаться для отправки сообщений и получения эха, он у нас вот такой — ws://stark-caverns-76076.herokuapp.com, я его менять в дальнейшем не буду, так что он будет я так думаю вечный, пока хероку не отключит нас.
В onCreate() мы проинициализировали layout, указали что запускаем сокет с помощью метода connectWebSocket(), в нем мы создали путь к которому будем стучаться, дальше создаем объект класса WebSocket и указываем путь, а дальше создаем колбеки которые будут нам возвращать какие-то состояния.
В методе onOpen() по открытию сокета мы отправляем серверу что за девайс подключился и что за система у него.
В onMessage() мы принимаем сообщения с сервера и отображаем в textView.
В onClose() мы просто закрываем все что у нас открыто касательно сокетов.
Ну и onError() возвращает ошибки сервера.
Дальше мы вызываем метод подключения к серверу, и воаля, у нас есть все для подключения к серверу. Осталось написать метод отправки сообщений, а он у нас ниже в клике по кнопке — onSendClick().
Вот собственно и все что нам нужно для написания приложения с сокетами. Дальше остается только реализовывать то что желает душа, что на сервере что на клиенте. Основной код готов к употреблению.
Комментариев нет:
Отправить комментарий