首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >客户端对客户端短消息

客户端对客户端短消息
EN

Stack Overflow用户
提问于 2018-11-05 09:41:50
回答 3查看 150关注 0票数 1

我正在Android中实现两个客户端之间的小通信。目前,我使用的是火柴实时数据库,它用push令牌保存我的所有用户。

我使用防火墙云消息传递将推送消息从一个发送到另一个,使用嵌入在代码中的REST。这不是很好的实践,因为我需要保存我的服务器密钥硬编码的应用程序。我考虑过使用XMPP,但它对我需要的东西有点过分。

我需要用户之间的小交流,因为一个询问另一个用户的位置,并得到坐标作为回报。这些消息不需要保存在服务器上,它只需要一次请求和响应。正如我之前说过的,我目前正在使用FCM。

如果没有XMPP,您能提出更好的解决方案吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-16 14:59:36

使用Firebase消息传递似乎是更好的方法。然而,如果这不适用于您,我们可以利用实时数据库来完成这个任务,尽管它并不是严格地客户机对客户端。

例如:假设有两个用户使用user1user2的UID。数据库的结构可以使每个用户在/requests/responses节点下都有自己的列表:

代码语言:javascript
复制
{
  "requests": {
    "user1": {},
    "user2": {}
  },
  "responses": {
    "user1": {},
    "user2": {}
  }
}

user2希望请求user1位置的场景中,客户端将遵循以下流程:

对于Android系统来说,它的工作方式如下:

代码语言:javascript
复制
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()方法中接收此响应。

这可能不是你想要的,但这对我来说是个有趣的练习,所以我还是想和大家分享。

票数 1
EN

Stack Overflow用户

发布于 2018-11-13 12:34:22

套接字非常简单,很多大公司都在使用它。

使用套接字客户端,您可以启用发送和接收方法,如果交换在应用程序中是两种方式。

例如:发送您的Lat &长时间使用

代码语言:javascript
复制
String location = "123123,123123"
mSocket.emit("Update", location);

若要接收其他用户的新位置,请将代码放在OnCreate内部。

代码语言:javascript
复制
mSocket.on("Update", GettingUpdate);
mSocket.connect();

并在GettingUpdate方法中执行逻辑操作

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2018-11-15 11:36:59

现在您可以使用firebase实时数据库和云防火墙数据库,而不需要FCM,您也可以获得实时和脱机。

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

尽情享受

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53151784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档