客户对客户短消息

时间:2018-11-05 09:41:50

标签: android firebase firebase-realtime-database firebase-cloud-messaging xmpp

我正在Android中实现两个客户端之间的小型通信。目前,我正在Firebase Realtime Database中使用推送令牌保留所有用户。

我使用Firebase Cloud Messaging使用嵌入在我的代码中的REST将推送消息从一个发送到另一个。由于我需要将服务器密钥硬编码保存在应用程序中,因此这不是一个很好的做法。我曾考虑过使用XMPP,但是对于我所需要的却有点过分。

我需要用户之间的小型通信,以便一个询问另一个用户的位置并获得坐标。消息不需要保存在服务器上,只需一次请求和响应即可。正如我之前所说,我目前正在为此使用FCM。

在没有XMPP的情况下,您能否建议更好的解决方案?

3 个答案:

答案 0 :(得分:1)

SOCKET非常简单,许多大公司正在使用它。

使用Socket客户端,如果换向是应用程序内部的两种方式,则可以启用Send和Receive方法。

例如: 要发送您的经纬度

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();

            }
        });
    }
};

您可以在documentation

中找到示例

Android项目示例:Github

答案 1 :(得分:1)

现在您可以使用Firebase实时数据库和Cloud Firestore数据库,而无需FCM,您也将获得实时和离线

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

享受

答案 2 :(得分:1)

似乎最好使用Firebase Cloud Messaging。但是,如果这对您不起作用,我们可以利用实时数据库来执行此操作,尽管它并不是严格的客户端到客户端。

作为一个示例:假设我们有2个用户的UID为user1user2。数据库的结构可以使每个用户在/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()方法接收此响应。

这可能不是您想要的,但这对我来说是一个有趣的练习,所以无论如何我都想分享。