如何解决连接套接字之前缓冲消息
所以我正在编写一个聊天工具,并且应用程序内部的大多数通信都是通过套接字进行的。
我正在使用Scarlet作为我的套接字库(对于我的问题并不是很重要,只是想让您知道),并且我正在使用协程/通道/流具有反应性流。
现在,有时套接字可能会断开连接并重新连接(或在第一次连接时),然后我必须通过套接字发送一些“ SYNC”消息。我现在有一个名为“ send”的方法,该方法接收套接字的消息并通过套接字发送它。问题是,如果尚未连接套接字,则消息会丢失。那是因为当您通过断开的套接字发送消息时,消息只会丢失。
我的问题:只要套接字未连接,然后发送所有“缓冲”消息,缓冲消息的最佳方法是什么?
到目前为止我想到的是
-
使用“映射/列表”将消息添加到该消息,并且套接字上线后立即对其进行迭代并发送消息。问题在于,在遍历消息的同时套接字可能再次脱机,然后某些消息会再次丢失。
-
我最喜欢的想法:创建一个kotlin
Channel
。在send方法中,我总是将消息添加到通道中。在一个额外的协程中,我将有如下代码:
launch {
while (true) {
subscribeState().first { it == State.Connected } // As far as I know this will block the coroutine and wait until it the first element is found,did I get this right?
val request = channel.receive() // It should be connected and we are waiting until the next request
if (getState() == State.Connected) { // Check again because we vould be offline again
jooyService.sendMessage(request) // Send message to socket
} else {
channel.send(request) // Put message back into channel as we could not handle it
}
}
}
该通道将具有足够大的缓冲区,以至于不总是挂起调用send()
的函数(例如100,但我不知道会消耗多少资源)
对此解决方案我不是100%满意,我也不知道它是否有任何缺陷,如果您能分享您对这个问题的想法和解决方案,我将非常高兴。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。