forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Android (http://forum.boolean.name/forumdisplay.php?f=150)
-   -   Соединение типа "клиент(android) <=> Сервер(php)" (http://forum.boolean.name/showthread.php?t=19756)

St_AnGer 22.03.2015 13:02

Соединение типа "клиент(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'ном на любой чих клиента в его сторону.

DStalk 22.03.2015 13:20

Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
 
На PHP только по запросам от клиента, или AJAX какой-нибудь юзать. Стучаться по адресу - у всех мобильников динамический адрес, смысла нет. Лучше написать свой сервер с постоянным коннектом.
Клиент запрашивающий считанные байты - не опухнет, даже по GPRS.:)

moka бы сказал что лучше серверную часть на node.js+mongodb:)

St_AnGer 22.03.2015 13:25

Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
 
Цитата:

Сообщение от DStalk (Сообщение 294457)
у всех мобильников динамический адрес, смысла нет

Есть мнение что один ip адрес и порт держится на протяжении одного коннекта (то есть до потери связи ил иотключения от интернета). Разве не так?

DStalk 22.03.2015 13:26

Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
 
Цитата:

Сообщение от St_AnGer (Сообщение 294458)
Есть мнение что один ip адрес и порт держится на протяжении одного коннекта (то есть до потери связи ил иотключения от интернета). Разве не так?

Так, но этот адрес не принадлежит мобильнику, и скрыт за NAT`ом (может быть куча клиентов под одним адресом) - до мобильника запрос не дойдет.

St_AnGer 22.03.2015 13:30

Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
 
Цитата:

Сообщение от DStalk (Сообщение 294459)
Так, но этот адрес не принадлежит мобильнику, и скрыт за NAT`ом (может быть куча клиентов под одним адресом) - до мобильника запрос не дойдет.

Да, это знаю. Именно по этому тред и создал. Я просто не очень понимаю как работают другие чаты (та же аська). Неужели очень часто запрашивают состояние у сервера?

SBJoker 22.03.2015 13:51

Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
 
Цитата:

Сообщение от DStalk (Сообщение 294459)
Так, но этот адрес не принадлежит мобильнику, и скрыт за NAT`ом (может быть куча клиентов под одним адресом) - до мобильника запрос не дойдет.

Вообще-то если коннект установлен, похрену нат или не нат, всё дойдёт куда надо.
Вся фигня с NAT'ом в том что нельзя приконнектится из вне, но если коннект есть, то уже пофиг.

DStalk 22.03.2015 14:35

Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
 
Цитата:

Сообщение от SBJoker (Сообщение 294461)
Вообще-то если коннект установлен, похрену нат или не нат, всё дойдёт куда надо.
Вся фигня с NAT'ом в том что нельзя приконнектится из вне, но если коннект есть, то уже пофиг.

Ну я собсно про это и говорю.:) Только в случае с PHP как раз надо коннектиться к клиенту.

Цитата:

Сообщение от St_AnGer (Сообщение 294460)
Да, это знаю. Именно по этому тред и создал. Я просто не очень понимаю как работают другие чаты (та же аська). Неужели очень часто запрашивают состояние у сервера?

Я так думаю держат постоянный коннект.

Igor 22.03.2015 15:45

Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
 
Теоретически, можно сделать два сокета от клиента к серверу и клиент в один будет писать и получать обычные запросы, а из другого - читать о внезапных появлениях новых сообщений. Читающий поток на клиенте будет блокироваться, пока чего-нибудь не получит.
Но я хз, насколько это адекватный способ. Мне почему-то кажется, что в один сокет не стоит одновременно пихать данные с двух сторон и пытаться их потом читать. Но ты попробуй, вдруг получится.

P.S. К слову, если писать сервер на java, то можно юзать встроенную в язык сериализацию и без проблем передавать объекты туда-сюда.

UPD: вот тут пишут, что вроде одного хватит

Knightmare 22.03.2015 15:58

Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
 
Long polling, например - http://habrahabr.ru/post/128535/
Всякие вконтакты юзают, например. Телеграмм тоже. Ну и еще овер9000 мессенджеров. Патаму шо просто и можно сделать на похапе даже труъ индусу. И всякие NAT не страшны.

St_AnGer 24.03.2015 12:52

Ответ: Соединение типа "клиент(android) <=> Сервер(php)"
 
Цитата:

Сообщение от Knightmare (Сообщение 294468)
Long polling, например - http://habrahabr.ru/post/128535/
Всякие вконтакты юзают, например. Телеграмм тоже. Ну и еще овер9000 мессенджеров. Патаму шо просто и можно сделать на похапе даже труъ индусу. И всякие NAT не страшны.

Потыкался, попробовал, это именно то что нужно. Спасибо!


Часовой пояс GMT +4, время: 11:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot