简体   繁体   English

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

[英]WebSocket Connection Established, but Client Can't Receive Messages from Others

I use Java Spring 4 and the tutorial I followed is Using websockets in Java using Spring 4 我使用Java Spring 4,并且遵循的教程是使用Spring 4在Java中使用websockets

My pom.xml: 我的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>

My WebSocketHandler: 我的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);
    }
}

This is my XML configuration: 这是我的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>

My page's HTML (jsp) code: 我页面的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>

The websocket connection is successful. Websocket连接成功。 If I send any message, <div id="result"> will print the message. 如果我发送任何消息, <div id="result">将打印该消息。

However, I cannot receive others' message. 但是,我无法收到其他人的消息。

For example: I use 2 browser A, B to link the page. 例如:我使用2个浏览器A,B链接页面。 The I send a message in browser A. The message will displayed in browser A but not in browser B . 我在浏览器A中发送一条消息。该消息将显示在浏览器A中,而不显示在浏览器B中

您只将消息发送到启动通信的一个会话中……请看一下它的API,因为我不熟悉Spring 4……应该有一种发送消息的方法。消息发送给所有连接的客户端,而不仅仅是会话。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM