Обмен короткими сообщениями от клиента к клиенту

1

Я реализую небольшую связь между двумя клиентами в Android. В настоящее время я использую базу данных Firebase Realtime, в которой все мои пользователи содержат push-токены.

Я использую Firebase Cloud Messaging для отправки push-сообщений от одного к другому, используя REST, встроенный в мой код. Это не очень хорошая практика, потому что мне нужно сохранить свой ключ сервера в приложении. Я думал об использовании XMPP, но это немного излишне для того, что мне нужно.

Мне нужно небольшое общение между пользователями, чтобы один спросил другого о своем местонахождении и получил координаты взамен. Сообщения не нужно сохранять на сервере, это всего лишь один раз запрос и ответ. Как я уже говорил, в настоящее время я использую FCM для этого.

Можете ли вы предложить лучшее решение для этого, без XMPP?

Теги:
firebase
firebase-cloud-messaging
xmpp
firebase-realtime-database

3 ответа

1
Лучший ответ

Кажется, что использование Firebase Cloud Messaging было бы предпочтительным методом. Однако, если это не работает для вас, мы могли бы использовать базу данных реального времени для этого, хотя это не будет строго клиент-клиент.

В качестве примера: представьте, что у нас есть 2 пользователя с UID user1 и user2. База данных может быть структурирована таким образом, чтобы у каждого пользователя был свой список в узлах /requests и /responses:

{
  "requests": {
    "user1": {},
    "user2": {}
  },
  "responses": {
    "user1": {},
    "user2": {}
  }
}

В сценарии, где user2 хочет запросить местоположение user1, клиенты будут следовать следующему потоку:

Изображение 174551

Для 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().

Возможно, это не совсем то, что вы ищете, но это было забавное упражнение для меня, поэтому я все равно хотел поделиться им.

1

теперь вы можете использовать базу данных Firebase в реальном времени и облачную базу данных Firestore. Нет необходимости в FCM, вы также получите в реальном времени и офлайн

https://code.tutsplus.com/tutorials/how-to-create-an-android-chat-app-using-firebase--cms-27397

наслаждаться

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню