Я реализую небольшую связь между двумя клиентами в Android. В настоящее время я использую базу данных Firebase Realtime, в которой все мои пользователи содержат push-токены.
Я использую Firebase Cloud Messaging для отправки push-сообщений от одного к другому, используя REST, встроенный в мой код. Это не очень хорошая практика, потому что мне нужно сохранить свой ключ сервера в приложении. Я думал об использовании XMPP, но это немного излишне для того, что мне нужно.
Мне нужно небольшое общение между пользователями, чтобы один спросил другого о своем местонахождении и получил координаты взамен. Сообщения не нужно сохранять на сервере, это всего лишь один раз запрос и ответ. Как я уже говорил, в настоящее время я использую FCM для этого.
Можете ли вы предложить лучшее решение для этого, без XMPP?
Кажется, что использование Firebase Cloud Messaging было бы предпочтительным методом. Однако, если это не работает для вас, мы могли бы использовать базу данных реального времени для этого, хотя это не будет строго клиент-клиент.
В качестве примера: представьте, что у нас есть 2 пользователя с UID user1
и user2
. База данных может быть структурирована таким образом, чтобы у каждого пользователя был свой список в узлах /requests
и /responses
:
{
"requests": {
"user1": {},
"user2": {}
},
"responses": {
"user1": {},
"user2": {}
}
}
В сценарии, где user2
хочет запросить местоположение user1
, клиенты будут следовать следующему потоку:
Для Android это будет работать примерно так:
private FirebaseDatabase database = FirebaseDatabase.getInstance();
private FirebaseAuth auth = FirebaseAuth.getInstance();
private String myUserId;
private void setup() {
if (auth.getCurrentUser() == null) { // User must be signed-in
finish();
return;
}
myUserId = auth.getCurrentUser().getUid();
DatabaseReference requestsRef = database.getReference("requests").child(myUserId);
DatabaseReference responsesRef = database.getReference("responses").child(myUserId);
requestsRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
handleRequest(dataSnapshot.getKey());
dataSnapshot.getRef().removeValue(); // Delete the request once it been handled
}
// ...
});
responsesRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String from = dataSnapshot.getKey();
String coordinates = dataSnapshot.getValue(String.class);
if (from != null && coordinates != null) handleResponse(from, coordinates);
dataSnapshot.getRef().removeValue(); // Delete the response once it been handled
}
// ...
});
}
private void handleResponse(String from, String coordinates) {
Toast.makeText(this, String.format("User: %s is located at: %s", from, coordinates), Toast.LENGTH_SHORT).show();
}
private void handleRequest(String from) {
Toast.makeText(this, String.format("User: %s wants to know our location", from), Toast.LENGTH_SHORT).show();
sendResponse(from);
}
private void sendResponse(String to) {
String myCoordinates = "37.4220° N, 122.0841° W"; // Example, this will need implementing
database.getReference("/responses").child(to).child(myUserId).setValue(myCoordinates);
}
private void sendRequest(String to) {
database.getReference("/requests").child(to).child(myUserId).setValue(true);
}
В этом примере оба пользовательских клиента сначала вызовут setup()
чтобы начать прослушивание запросов и ответов.
Затем, чтобы запросить пользовательские координаты, вызовите sendRequest()
с одного клиента. Другой клиент получит этот запрос в метод handleRequest()
и отправит свои координаты в базу данных. Наконец, запрашивающий клиент получит этот ответ в handleResponse()
.
Возможно, это не совсем то, что вы ищете, но это было забавное упражнение для меня, поэтому я все равно хотел поделиться им.
теперь вы можете использовать базу данных Firebase в реальном времени и облачную базу данных Firestore. Нет необходимости в FCM, вы также получите в реальном времени и офлайн
https://code.tutsplus.com/tutorials/how-to-create-an-android-chat-app-using-firebase--cms-27397
наслаждаться
SOCKET очень прост, и многие крупные корпорации используют его.
С клиентом Socket вы можете включить метод отправки и получения, если коммутация будет осуществляться двумя способами внутри вашего приложения.
Например: чтобы отправить свой Lat & Long использовать
String location = "123123,123123"
mSocket.emit("Update", location);
И чтобы получить другое местоположение нового пользователя, поместите ниже код в вашем OnCreate
:
mSocket.on("Update", GettingUpdate);
mSocket.connect();
И сделайте свою логику в методе GettingUpdate
private Emitter.Listener GettingUpdate= new Emitter.Listener() {
@Override
public void call(final Object.. args) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject) args[0];
String location;
try {
location= data.getString("location");
} catch (JSONException e) {
return;
}
Toast.makeText(getActivity(), message,Toast.LENGTH_LONG).show();
}
});
}
};
Вы можете найти пример в документации
Пример проекта Android: Github