Обмен короткими сообщениями от клиента к клиенту - PullRequest
0 голосов
/ 05 ноября 2018

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

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

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

наслаждайся

0 голосов
/ 16 ноября 2018

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

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

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

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

flow

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

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

0 голосов
/ 13 ноября 2018

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

...