В Android с использованием okhttp websocket, в этом методе onMessage прослушивателя не работает должным образомAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 В Android с использованием okhttp websocket, в этом методе onMessage прослушивателя не работает должным образом

Сообщение Anonymous »

**мой код на Kotlin**

Код: Выделить всё

    class Listener(
val onMessage: (String) -> Unit,
val onClosed: () -> Unit,
val onFail: (String) -> Unit,
val onOpen: (WebSocket) -> Unit,
val onClosing: () -> Unit
) :
WebSocketListener() {
override fun onOpen(webSocket: WebSocket, response: Response) {
super.onOpen(webSocket, response)
onOpen(webSocket)
}

override fun onMessage(webSocket: WebSocket, text: String) {
super.onMessage(webSocket, text)
Log.d("websocket", "new message")
onMessage(text)
}

override fun onClosed(
webSocket: WebSocket,
code: Int,
reason: String
) {
super.onClosed(webSocket, code, reason)
onClosed()
}

override fun onClosing(
webSocket: WebSocket,
code: Int,
reason: String
) {
super.onClosing(webSocket, code, reason)
onClosing()
}

override fun onFailure(
webSocket: WebSocket,
t: Throwable,
response: Response?
) {
super.onFailure(webSocket, t, response)
onFail(t.toString())
}
}

private suspend fun connectRequest(
email: String,
saveDb: suspend (ChatsMessage) -> Long
): Boolean =
suspendCoroutine { continuation ->
val listener = Listener(
onMessage = {
Log.d("websocket", it)
},
onClosed = {
_isConnectedToWebSocket.value = false
},
onFail = { failure ->
_isConnectedToWebSocket.value = false
if (continuation.context.isActive) {
continuation.resume(false)
}
},
onOpen = {
_isConnectedToWebSocket.value = true
myWebSocket = it
if (continuation.context.isActive) {
continuation.resume(true)
}
},
onClosing = {},
)
val request =
Request.Builder().url("ws://192.168.24.176:8000/chats/?email=$email").build()
client.newWebSocket(request, listener)

}
**мой код сервера веб-сокетов fastapi на Python
**

Код: Выделить всё

class ConnectionManager:

async def connect(self, websocket: WebSocket, useremail: str):
await websocket.accept()
activeConnection[useremail] = websocket

# Send pending messages if any
if useremail in pendingmessages:
messages = pendingmessages[useremail]
for message in messages:
try:
await websocket.send_json(message)
if len(pendingmessages[useremail]) >  0:
pendingmessages[useremail].remove(message)
else:
del pendingmessages[useremail]

except RuntimeError:
self.disconnect(useremail)

def disconnect(self, email: str):
activeConnection.pop(email)

async def sendmessage(self, msgdata: Any, receiveremail: str):
if receiveremail in activeConnection:
websocket = activeConnection[receiveremail]

try:
await websocket.send_json(msgdata)
except RuntimeError:
self.disconnect(receiveremail)
pendingmessages[receiveremail].append(msgdata)

else:
if receiveremail not in pendingmessages:
pendingmessages[receiveremail] = []

pendingmessages[receiveremail].append(msgdata)

connection = ConnectionManager()

@app.websocket("/chats/")
async def websocket_endpoint(websocket: WebSocket, email: str):
await connection.connect(websocket, email)

try:
while True:
msg_data = await websocket.receive_json()
receiver_email = str(msg_data["receiverEmail"])
print(f'new message received from {receiver_email}')
await connection.sendmessage(msg_data, receiver_email)

except WebSocketDisconnect:
connection.disconnect(email)

когда пользователь a отправляет сообщение, а пользователь b находится в автономном режиме, предположим, что пользователь a отправил 20 сообщений пользователю b, и теперь от пользователя a оно отправляется на сервер и сохраняется на сервере, когда пользователь b выходит в Интернет, затем пользователь b получает только несколько сообщений, я пытался использовать очередь Android, но проблема все та же, поэтому я напрямую распечатал полученное сообщение в журнале, приходит только несколько сообщений, как исправить

Подробнее здесь: https://stackoverflow.com/questions/792 ... not-workin
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»