Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在客户端重新建立其丢失的连接后,保存通过套接字从服务器发送到客户端的数据的正确方法是什么_Android_Asp.net Core_Signalr - Fatal编程技术网

Android 在客户端重新建立其丢失的连接后,保存通过套接字从服务器发送到客户端的数据的正确方法是什么

Android 在客户端重新建立其丢失的连接后,保存通过套接字从服务器发送到客户端的数据的正确方法是什么,android,asp.net-core,signalr,Android,Asp.net Core,Signalr,我有.netcore编写的api和android手机客户端。其中两个之间有信号插座连接。当用户在移动应用程序上打开一个事件时,我将该事件数据保存到服务器上的db,并通过套接字将其发送给其他用户,这些用户监听事件创建者 我定期控制移动应用程序上的套接字连接,如果他们失去连接,我可以重新连接。到目前为止我没有问题。。但是我无法为断开连接的用户保留数据 让我举例说明: 有用户:Producer1,Consumer1,Consumer2 如果Producer1通过mobile app打开一个事件。它

我有
.netcore
编写的
api
android手机
客户端。其中两个之间有
信号
插座连接。当用户在移动应用程序上打开一个
事件
时,我将该
事件数据
保存到服务器上的
db
,并通过套接字将其发送给其他
用户
,这些用户监听
事件创建者

我定期控制移动应用程序上的套接字连接,如果他们失去连接,我可以重新连接。到目前为止我没有问题。。但是我无法为
断开连接的用户保留
数据

让我举例说明:
有用户:
Producer1
Consumer1
Consumer2

如果
Producer1
通过
mobile app
打开一个事件。它通过
httprequest
数据
发送到
服务器
,我将其保存到
db

将数据保存到
db
后,我通过
套接字连接将此
数据
发送到
Consumer1
Consumer2
。 假设
Consumer2
在发送
事件数据时没有网络连接。

有网络连接的
Consumer1
成功获取
数据
,我对
Consumer1
没有问题。
但是,
Consumer2
无法获取
数据
,因为它失去了它们的套接字连接,我们还没有重新连接。 发送的
事件数据已丢失。因此
Consumer2
将不会获取
事件数据。

我的问题是,当
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);
客户端代码示例:

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

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

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

但是,您应该具备以下能力:

  • 希望接收事件的所有已连接客户端的列表
  • 这些事件的存储(我们使用Cosmos Db,但缓存可以很好地工作)
因此,在事件完成之前,您不会处理该事件。但是,如何将事件重新发送给当时未连接的用户


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

感谢您的详细回答。所以,技巧对我来说是易变的。实际上,我有一些方法在使用前等待验证。所以你的方法已经在我的“可能性列表”中了,我正在搜索关键字,以找到最有效的方法来创建我的结构,然后你验证其中一个。这是一个非常清楚和描述性的回答。再次感谢你。