java - WebSocket 连接已建立,但客户端无法接收其他人的消息

标签 java spring websocket spring-websocket

我使用Java Spring 4,我遵循的教程是 Using websockets in Java using Spring 4

我的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    ...
    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>4.2.0.RELEASE</org.springframework-version>
        <org.aspectj-version>1.6.10</org.aspectj-version>
        <org.slf4j-version>1.6.6</org.slf4j-version>
    </properties>

    <dependencies>
        ...

        <!-- Web Socket -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-websocket</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-messaging</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
    </dependencies>
</project>

我的 WebSocketHandler:

package com.example.smvcws;

import org.apache.log4j.Logger;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class WebsocketEndPoint extends TextWebSocketHandler {
    @Override
    protected void handleTextMessage(WebSocketSession session,
            TextMessage message) throws Exception {
        TextMessage returnMessage = new TextMessage(message.getPayload()+" received at server");
        session.sendMessage(returnMessage);
    }
}

这是我的 XML 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:websocket="http://www.springframework.org/schema/websocket"
    xsi:schemaLocation="http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    ... 

    <beans:bean id="websocketEndPoint" class="com.example.smvcws.WebsocketEndPoint" />
    <websocket:handlers allowed-origins="*">
        <websocket:mapping path="/websocket" handler="websocketEndPoint" />
        <websocket:handshake-interceptors>
            <beans:bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor" />
        </websocket:handshake-interceptors>
    </websocket:handlers>
</beans:beans>

我的页面的 HTML (jsp) 代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Websocket Test</title>
</head>
<body>
    <textarea></textarea>
    <button>send</button>
    <div id="result"></div>

    <script type="text/javascript">
        var select = document.querySelector.bind(document)
        var ws = new WebSocket('ws://' + location.host + "<%=request.getContextPath()%>/websocket")
        ws.addEventListener("message", function(e){
            var div = document.createElement("div")
            div.innerHTML += "<span>" + e.data + "</span>"
            div.innerHTML += " @ "
            div.innerHTML += "<time>" + (new Date(e.timeStamp)).toLocaleString() + "</time>" 
            select("#result").appendChild(div)
        })

        select("button").addEventListener("click", function (e) {
            switch(ws.readyState){
                case WebSocket.OPEN:
                case WebSocket.CONNECTING:
                    ws.send(select("textarea").value)
                    break
                case WebSocket.CLOSED:
                case WebSocket.CLOSING:
                    select("#result").innerHTML += "<div style='color:FireBrick'>Error: Websocket is closed (<time>" + (new Date).toLocaleString() + "</time>)</div>"
                    break
            }

        })
    </script>
</body>
</html>

WebSocket 连接成功。如果我发送任何消息,<div id="result">将打印该消息。

但是我收不到别人的消息。

例如:我使用2个浏览器A、B来链接页面。我在浏览器 A 中发送消息。该消息将显示在浏览器 A 中但不会显示在浏览器 B 中。

最佳答案

你只是将消息发送到发起通信的一个 session ...看看它的 API,因为我不熟悉 Spring 4...应该有一种方法向所有连接的客户端发送消息,而不仅仅是 session 。

关于java - WebSocket 连接已建立,但客户端无法接收其他人的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34174333/

相关文章:

Java 方法定义显着降低了执行速度

spring - 使用spring boot时如何升级spring-hateoas?

javascript - ActiveMQ-Stomp 消费者收不到消息

node.js - Reactjs 无法建立套接字连接,它在调用 componentDidMount 时打开并获取响应

java - 从 JAVA 中的 MAP 打印

java - 什么是子类化?

java - Spring Boot : java. lang.IllegalArgumentException:找到多个名为 [spring_web] 的片段

java - Spring Hibernate 数据库查询不起作用

python - Websocket 线程

java - 适用于 Android 的 C++ 或 Java?