Antwort vom Server an mehreren Clients senden

RezaScript

Bekanntes Mitglied
Hallo,

ich verwende WebSocket für einen Chat. Die Verbindung zwischen Client und Server funktioniert soweit sehr gut. Ich kann Daten an Server senden und empfangen. Das ganze funktioniert aber nur mit einem einzigen Client. Was muss ich machen, dass wenn der Server sendet, alle anderen Clients auch die Meldung erhalten?

Java:
package ch.yourclick.zt.chat;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/chat")
public class ChatEndpoint {
    @OnOpen
    public void handleOpen() {
        System.out.println("Client is now connected");
    }

    @OnMessage
    public String handleMessage(String message) {
        System.out.println("Client: " + message + "\n");
        return message;
    }

    @OnClose
    public void handleClose() {
        System.out.println("Client is now disconnected");
    }

    @OnError
    public void handleError(Throwable t) {
        t.printStackTrace();
    }
}

HTML:
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Chat</title>
</head>
<body>

<form id="chat">
    <input type="text" id="client-msg">
    <input type="submit" value="Send">
</form>

<div class="result"></div>

<script src='../assets/js/script.js'></script>
</body>
</html>

Javascript:
const log = console.log.bind(console);

/* CHAT */
const webSocket = new WebSocket('ws://localhost:8080/zt_productions_war/chat');
const chatResult = document.querySelector('.result');

// Open
webSocket.onopen = (msg) => {
    log("Server is now connected\n");
};

// Message
webSocket.onmessage = (msg) => {
    chatResult.innerHTML += "Server says: " + msg.data;
};

// Close
webSocket.onclose = () => {
    webSocket.send('Client has been disconnected');
    log("Server is now closed\n");
};

// Error
webSocket.onerror = () => {
  log("There is an error. Try it again later.");
};

// Submit
document.getElementById("chat").addEventListener('submit', (e) => {
    e.preventDefault();
    let clientMsg = document.getElementById('client-msg');
    webSocket.send(clientMsg.value);
    chatResult.innerHTML += clientMsg.value + '<br>';
    clientMsg.value = '';
});
 
Du brauchst nur eine statische Liste von Sessions mittels ConcurrentLinkedDeque bzw. ConcurrentLinkedQueue verwalten. Beim Öffnen fügst Du die aktuelle Session zur Liste hinzu, beim Schließen bzw. im Fehlerfall (handleError) entfernst Du die Session aus der Liste. Zum Senden iterierst Du über die Liste und schickst die Message raus.
 
Okay, einfach nur damit ich die Logik richtig verstanden habe: Bei einer Verbindung mit dem Socket bekommt jeder Client eine Session. Der Server sendet via Loop eine Nachricht an alle Clients, welche eine Session haben. Soweit richtig? Wenn ja, wie könnte ich eine Message an alle Clients schicken, welche eine Session haben? Momentan sende ich die Nachricht ja nur mit return message.
 

Zurück
Oben