在客户端重新建立失去连接后,服务器通过socket向客户端发送的数据,正确的保存方法是什么?

问题描述 投票:1回答:1

我有 .net core 书面 apiandroid mobile 客户端。有 signalr 两者之间的套接字连接。当用户打开一个 event 在手机应用上,我保存这个 event datadb 在服务器上发送,并将其发送到其他 users 倾听者 event creator 通过插座. 我定期在手机应用上控制插座连接,如果他们失去连接,我可以重新连接他们。到目前为止,我没有任何问题。但我有问题保持 data 对于 lost connection user

让我举例说明。 有用户 : Producer1, Consumer1, Consumer2 如果 Producer1 打开一个事件,通过 mobile app. 它发送 dataserver 通过 httprequest 我把它保存到 db. 在将数据保存到 db,我送这个 dataConsumer1Consumer2 通过 socket connection. 让我们说 Consumer2 发送时没有网络连接 event data. Consumer1 有网络连接的,获得 data 成功,我没有问题 Consumer1. 但是.., Consumer2 得不到 data 因为它失去了他们的插座连接,而我们还没有重新连接。event data 已经走了。所以 Consumer2 不会得到 event data.

我的问题是,我怎样才能保持 data 并送去 Consumer2 当初 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个回答
1
投票

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

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

但要执行这个任务,你应该有

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

因此,你不会处置事件,直到它完成。但是你如何重新发送事件给当时没有连接的用户呢?

只需创建一个枢纽方法,在连接建立后由客户端调用,发送待处理的事件(该用户没有注册为接收的事件,所以他们没有调用回调方法)。

© www.soinside.com 2019 - 2024. All rights reserved.