Соединение типа "клиент(android) <=> Сервер(php)"
Добрый день, Булка!
Пишу тут чатик простейший (аля аська, только без заморочек: 2 статуса - онлайн и оффлайн, инфа о пользователе, передача сообщений), учусь программировать под андрюшу. Свободно получилось сделать регистрацию, авторизацию, запрос всяких списков из базы данных (групп, поиска пользователей, имеющихся контактов, сообщений и т.п.). И вот я подошёл к главному моменту данного изучения - передача сообщений. И, собственно, у меня возник вопрос - а как это делается? Передать сообщений на сервер - проще простого. А вот как серверу отдать сообщение нужному клиенту? В базе данных храню последний использованный ip и порт пользователя. Конечно можно сделать довольно просто - пусть клиент сам обновляет свои сообщения когда ему нужно. Но это ведь плохой способ, все нормальные чатики онлайн отдают пользователю пришедшие сообщения. Принцип я понимаю как то так: 1) на сервер пришло сообщение от пользователя A, предназначенное пользователю B; 2) сервер смотрит адрес пользователя B в базе; 3) сервер стучится по найденному адресу (что то типа ping) что бы убедиться в его валидности; 4) если нужный ответ получен - отправляем по данному адресу сообщение и ждём уведомление о принятии сообщения клиентом B; 5) отправляем клиенту A уведомление что сообщение доставлено (опционально). Хотя можно и проще - на клиенте раз в какое то время (раз в N-секунд) спрашивать список сообщений (ну или проверять флаг новых сообщений, если его сделать). Но это помоему лишняя нагрузка на сервак, да и с нашими уровнями сотовых сигналов - приложение само опухнет от своих же запросов. Подскажите пожалуйста знающие люди, хотя бы куда и в какую сторону копать. Сервер на голом PHP, база пока что MySQL (потом будет скорее всего Firebird, полюбилась она мне что то). Клиент на андроиде (пишу в Android Studio 1.1.0) отправляет запросы на сервер в через DefaultHttpClient методом HttpPost, сервер отвечает JSON'ном на любой чих клиента в его сторону. |
Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
На PHP только по запросам от клиента, или AJAX какой-нибудь юзать. Стучаться по адресу - у всех мобильников динамический адрес, смысла нет. Лучше написать свой сервер с постоянным коннектом.
Клиент запрашивающий считанные байты - не опухнет, даже по GPRS.:) |
Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
Цитата:
|
Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
Цитата:
|
Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
Цитата:
|
Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
Цитата:
Вся фигня с NAT'ом в том что нельзя приконнектится из вне, но если коннект есть, то уже пофиг. |
Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
Цитата:
Цитата:
|
Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
Теоретически, можно сделать два сокета от клиента к серверу и клиент в один будет писать и получать обычные запросы, а из другого - читать о внезапных появлениях новых сообщений. Читающий поток на клиенте будет блокироваться, пока чего-нибудь не получит.
Но я хз, насколько это адекватный способ. Мне почему-то кажется, что в один сокет не стоит одновременно пихать данные с двух сторон и пытаться их потом читать. Но ты попробуй, вдруг получится. P.S. К слову, если писать сервер на java, то можно юзать встроенную в язык сериализацию и без проблем передавать объекты туда-сюда. UPD: вот тут пишут, что вроде одного хватит |
Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
Long polling, например - http://habrahabr.ru/post/128535/
Всякие вконтакты юзают, например. Телеграмм тоже. Ну и еще овер9000 мессенджеров. Патаму шо просто и можно сделать на похапе даже труъ индусу. И всякие NAT не страшны. |
Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
Цитата:
|
Часовой пояс GMT +4, время: 11:18. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot