Клиент Swift iOS успешно подключается к серверной части Java через WebSocket, но не может получать сообщенияIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Клиент Swift iOS успешно подключается к серверной части Java через WebSocket, но не может получать сообщения

Сообщение Anonymous »

Я работаю над клиентом iOS, использующим Starscream для связи с серверной частью Java через WebSocket. Соединение успешно установлено, и я могу отправлять сообщения. Однако клиент Swift не получает никаких сообщений — несмотря на все усилия по отладке, ничего не приходит.
Интересно, что когда я использую клиент JavaScript, я могу получать сообщения без проблем (код приведен ниже). . Это подтверждает, что серверная часть правильно отправляет сообщения. Буду признателен за любую информацию о том, что может быть причиной этой проблемы.
iOS WebSocket Manager (Starscream):

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

import Foundation
import Starscream
import SwiftUI

class WebSocketManager: WebSocketDelegate {
static let shared = WebSocketManager()

@AppStorage("userId") private var userId: String = ""
var socket: WebSocket!
var isConnected: Bool = false
var subscribedTopics: Set = []
var onMessageReceived: ((ChatMessage) -> Void)?

private init() {
connectWebSocket()
}

func connectWebSocket() {
var request = URLRequest(url: URL(string: "ws://192.168.0.80:9001/ws")!)
request.timeoutInterval = 5

if let jwtToken = TokenManager.shared.getAccessToken() {
request.setValue("Bearer \(jwtToken)", forHTTPHeaderField: "Authorization")
}

socket = WebSocket(request: request)
socket.delegate = self
socket.connect()

let friends = CoreDataFriendManager.shared.loadAllFriends()
friends.forEach { friend in
if let topicName = friend.topicName {
subscribeToMessages(with: topicName)
}
}
listenToWebSocketMessagesGlobally()
}

func sendMessage(_ message: SendMessageRequest) {
if !isConnected { return }

if let token = TokenManager.shared.getAccessToken() {
let stompMessage = """
SEND
destination:/app/send-message
content-type:application/json
Authorization: Bearer \(token)

{
"recipientId": "\(message.recipientId.uuidString)",
"encryptedMessage": "\(message.encryptedMessage)"
}
\0
"""
socket.write(string: stompMessage)
}
}

func subscribeToMessages(with topicName: String) {
if subscribedTopics.contains(topicName) { return }

let subscribeMessage = """
SUBSCRIBE
id:sub-\(topicName)
destination:/topic/messages/\(topicName)

\0
"""
socket.write(string: subscribeMessage)
subscribedTopics.insert(topicName)
}

// WebSocket-Event-Handling
func didReceive(event: WebSocketEvent, client: WebSocketClient) {
switch event {
case .connected(let headers):
print("WebSocket verbunden mit Headern: \(headers)")
isConnected = true
for topicName in subscribedTopics {
subscribeToMessages(with: topicName)
}
case .disconnected(let reason, let code):
print("WebSocket getrennt: \(reason) mit Code \(code).  Versuche erneut zu verbinden.")
isConnected = false
reconnectWebSocket()

case .text(let string):
print("Empfangene WebSocket Nachricht: \(string)")

if string.contains("MESSAGE") {
let components = string.split(separator: "\n").map(String.init)
if let jsonData = components.last?.data(using: .utf8) {
do {
let serverMessage = try JSONDecoder().decode(ServerMessage.self, from: jsonData)
let chatMessage = convertServerMessageToChatMessage(serverMessage)
onMessageReceived?(chatMessage)
print("Nachricht erfolgreich dekodiert und verarbeitet: \(chatMessage)")
} catch {
print("Fehler beim Dekodieren der Nachricht: \(error)")
}
}
} else {
print("Keine gültige STOMP-Nachricht empfangen oder Nachricht nicht im erwarteten Format.")
}

case .binary(let data):
print("Binary-Daten empfangen: \(data)")

case .pong(let data):
print("Pong empfangen: \(data?.count ?? 0) bytes")

case .ping(let data):
print("Ping empfangen: \(data?.count ?? 0) bytes")

case .error(let error):
print("WebSocket-Fehler: \(error?.localizedDescription ?? "Unbekannter Fehler")")
isConnected = false

case .viabilityChanged(let viable):
print("Verbindungsfähigkeit geändert: \(viable)")

case .reconnectSuggested(let suggested):
print("Reconnect vorgeschlagen: \(suggested)")
if suggested {
reconnectWebSocket()
}

case .cancelled:
print("WebSocket abgebrochen.")
isConnected = false

default:
break
}
}

private func convertServerMessageToChatMessage(_ serverMessage: ServerMessage) -> ChatMessage {
return ChatMessage(id: serverMessage.messageId, text: serverMessage.encryptedMessage, isSentByCurrentUser: false, timestamp: serverMessage.timestamp, senderName: "TestUser")
}
}

Клиент JavaScript WebSocket (работает правильно):
Вот код JavaScript, который успешно получает сообщения:

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

const Stomp = require('stompjs');
const WebSocket = require('ws'); // ws-Paket verwenden

const socket = new WebSocket('ws://192.168.0.80:9001/ws');
const stompClient = Stomp.over(socket);

socket.on('open', () => console.log("WebSocket-Verbindung geöffnet"));
socket.on('close', () => console.log("WebSocket-Verbindung geschlossen"));
socket.on('error', (error) =>  console.error("WebSocket-Fehler:", error));

const headers = {
Authorization: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIwNjQ3OGQxZC1hZTMxLTQ0MjktYWY4ZS02ZGMzMDVlMTYwOTciLCJpYXQiOjE3Mjk5NjUxNzMsImV4cCI6MTcyOTk2ODc3M30.xPdkLLv4LArvn00jAChKjsSE5RPt5zipgYGE0CNxe5BYsAvEomhIQohodNPTJat2pMVTgn2NkauZ8K3iiOt7DA'
};

stompClient.connect(headers, function (frame) {
console.log('STOMP-Verbindung hergestellt:', frame);

stompClient.subscribe('/topic/messages/1ed08549-ade6-4baa-b741-5634b75379f4', function (message) {
console.log("Nachricht empfangen:", message.body);

console.log("Header der Nachricht:", message.headers);
console.log("Inhalt der Nachricht:", message.body);

try {
const parsedMessage = JSON.parse(message.body);
console.log("JSON-Dekodierte Nachricht:", parsedMessage);
} catch (error) {
console.error("Fehler beim Parsen der Nachricht:", error);
}
});

const messageBody = JSON.stringify({
recipientId: "dd703e8e-8df1-4d27-9676-672d8c95d326",
encryptedMessage: "Hallo von User A!"
});

console.log("Sende Nachricht:", messageBody);
stompClient.send("/app/send-message", headers, messageBody);
},
function (error) {
console.error("Verbindungsfehler mit STOMP:", error);
});

stompClient.debug = function (str) {
console.log("STOMP-DEBUG:", str);
};
Получено сообщение в клиенте JavaScript:
Вот как сообщение выглядит в клиенте JS, и оно успешно получено :

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

STOMP-DEBUG: 

Подробнее здесь: [url]https://stackoverflow.com/questions/79129353/swift-ios-client-successfully-connects-to-java-backend-via-websocket-but-fails-t[/url]
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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