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方法,在建立连接后由客户端调用,以发送挂起的事件(此用户尚未注册为已接收的事件,因此他们没有调用回调方法)。感谢您的详细回答。所以,技巧对我来说是易变的。实际上,我有一些方法在使用前等待验证。所以你的方法已经在我的“可能性列表”中了,我正在搜索关键字,以找到最有效的方法来创建我的结构,然后你验证其中一个。这是一个非常清楚和描述性的回答。再次感谢你。