【问题标题】:What is the correct way to save data that will be sent from server to client via socket after client reestablish its lost connection客户端重新建立丢失的连接后,保存将通过套接字从服务器发送到客户端的数据的正确方法是什么
【发布时间】:2020-05-27 00:03:54
【问题描述】:

我有.net coreapiandroid mobile 客户。其中两个之间存在signalr 套接字连接。当用户在移动应用程序上打开event 时,我将这个event data 保存到服务器上的db 并将其发送给通过套接字侦听event creator 的其他users
我会定期控制移动应用程序上的套接字连接,如果它们失去连接,我可以重新连接它们。到目前为止我没有问题.. 但我有问题保留 datalost connection user

让我举例说明:
有用户:Producer1Consumer1Consumer2
如果Producer1 通过mobile app 打开一个事件。它通过httprequestdata 发送到server,然后我将其保存到db
将数据保存到db 后,我通过socket connection 将这个data 发送到Consumer1Consumer2。 假设Consumer2 在发送event data 时没有网络连接。
Consumer1 有网络连接,成功获取data,我对Consumer1 没有问题。
但是,Consumer2 无法获得data,因为它失去了他们的套接字连接,我们还没有重新连接。 发送的event data 已经消失了。所以Consumer2 不会得到event data

我的问题是,当Consumer2 重新建立连接时,我如何保留data 并将其发送给Consumer2。这样做的有效和正确方法是什么。

服务器端代码示例:

    public async Task AddEvent(GetEventOutput getEventOutput)
    {
        if(getEventOutput.Active)
        {
            await _hubContext.Clients.Group(SignalR_EVENT + QUESTION_MARK + EVENT_WITH_USER + EQUAL_DASH + getEventOutput.UserID).SendAsync(CREATE_EVENT_ON_MOBILE, JsonConvert.SerializeObject(getEventOutput));
            sendEventCreateNotification(getEventOutput);
        }
    }

客户端代码示例:

    hubConnection.on(CREATE_EVENT_ON_MOBILE, (getEventOutput) -> {
        System.out.println("CREATE_EVENT_ON_MOBILE : ");
        setUiAfterSignalrHandler.post(new Runnable() {
            @Override
            public void run() {
                if (!isNullOrEmpty(getEventOutput)) {
                    Event event = gson.fromJson(getEventOutput, Event.class);
                    eventsWithTimerRecyclerViewAdapter.insertItem(0, event);
                    setUiAfterSignalrHandler.removeCallbacks(this);
                    leftAndRightTextWithTimerRecyclerView.removeEmptyPlaceHolder(eventsWithTimerRecyclerViewAdapter);
                }
            }
        });
        restartSocket();
    }, String.class);

【问题讨论】:

    标签: android asp.net-core signalr


    【解决方案1】:

    我们有类似的情况,但有通知。为避免您的问题,我建议使用缓存或易失性存储来存储这些事件。

    例如,当您将事件发送给客户端时,他们应该调用一个回调方法注册他们收到了该事件,然后当所有订阅者成功响应该事件时您将您的事件注册为已完成,您可以处理该事件。

    但是你应该执行这个:

    • 想要接收事件的所有已连接客户端的列表。
    • 这些事件的存储(我们使用 Cosmos Db,但缓存可以正常工作)。

    因此,在事件完成之前,您不会处置该事件。但是,您如何将事件重新发送给当时未连接的用户?

    只需创建一个集线器方法,在连接建立后由客户端调用以发送未决事件(此用户尚未注册为已接收的事件,因此他们没有调用回调方法)。

    【讨论】:

    • 感谢您的详细解答。所以技巧对我来说是不稳定的。实际上我有一些方法在使用前等待验证。因此,您的方法已经在我的“可能性列表”中,我正在搜索关键字以达到创建我的结构的最有效方法,并且您验证其中一个。这是一个非常明确和描述性的答案。再次感谢您。
    猜你喜欢
    • 2019-08-08
    • 2013-04-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2020-03-06
    • 1970-01-01
    相关资源
    最近更新 更多