WebSocket连接失败(Java) Error during WebSocket handshake: Unexpected response code: 400

今天天气不错啊 发布于 2018/01/11 11:22
阅读 7K+
收藏 0

项目名 chat  端口号8080 访问路径:"ws://localhost:8080/websocket"  jdk :1.8, Maven配置的tomcat是tomcat8, POM.xml添加了javax.websocket-api,spring-websocket和javax.servlet-api(provided)依赖。web.xml里的<url-pattern/>为"/", 访问Controller路径正常。访问websocket路径报错:Error during WebSocket handshake: Unexpected response code: 400 . 
不知道 websocket路径 是不是被 DispatcherServlet被拦截了?还是url有问题。 请坛友帮忙解答,谢谢。

 <build>
        <finalName>chat</finalName>
        <!-- 配置插件 -->
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId> 
                <artifactId>tomcat-maven-plugin</artifactId>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                    <uriEncoding>UTF-8</uriEncoding>
                </configuration>
            </plugin>
        </plugins>
</build>


后端代码:

@ServerEndpoint(value = "/websocket", configurator = SocketConfigurator.class)
public class WebServer {
    
    @OnOpen
    public void open(Session session){
        System.out.println("OPEN is running");
    }
    
    @OnMessage
    public void receiveMessage(String message, Session session){
        System.out.println(" send Message .. " +message);
        session.getAsyncRemote().sendText(message);
    }
    
    @OnClose
    public void close(){
        System.out.println("Close is running ...");
    }
}
public class SocketConfigurator extends Configurator {
    @Override
    public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
        HttpSession httpSession = (HttpSession) request.getHttpSession();
        config.getUserProperties().put("ClientIP", httpSession.getAttribute("ClientIPadd"));
    }
}

前端代码:

<!DOCTYPE html>
<html>

    <head>
        <meta name="viewport" content="width=device-width" />
        <title>WebSocket 客户端</title>
    </head>

    <body>
        <div>
            <input type="button" id="btnConnection" value="连接" />
            <input type="button" id="btnClose" value="关闭" />
            <input type="button" id="btnSend" value="发送" />
        </div>
        <script src="http://code.jquery.com/jquery-3.2.1.js"integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE="
  crossorigin="anonymous"></script>
        <script type="text/javascript">
            var socket;
            if(typeof(WebSocket) == "undefined") {
                alert("您的浏览器不支持WebSocket");
                
            }

            $("#btnConnection").click(function() {
                //实现化WebSocket对象,指定要连接的服务器地址与端口
				socket = new WebSocket("ws://localhost:8080/websocket");
				
                //打开事件
                socket.onopen = function() {
                    alert("Socket 已打开");
                    //socket.send("这是来自客户端的消息" + location.href + new Date());
                };
                //获得消息事件
                socket.onmessage = function(msg) {
                    alert(msg.data);
                };
                //关闭事件
                socket.onclose = function() {
                    alert("Socket已关闭");
                };
                //发生了错误事件
                socket.onerror = function() {
                    alert("发生了错误");
                }
            });
            
            //发送消息
            $("#btnSend").click(function() {
                socket.send("这是来自客户端的消息" + location.href + new Date());
            });
            
            //关闭
            $("#btnClose").click(function() {
                socket.close();
            });
        </script>
    </body>

</html>

 

加载中
0
今天天气不错啊
今天天气不错啊

终于解决了。 pom的依赖(版本什么的注意下,或许不对,可以去http://mvnrepository.com 寻找),问题在于tomcat的版本,http://liyunpeng.iteye.com/blog/1979718 提到的“而在开发的过程中,就要引入Tomcat7的 Run Time 的依赖包,不要用WebSocket-api.jar ”。 我不会这个,我觉得得来个高版本的tomcat,本地磁盘装的是tomcat8,但是每次执行 Run as  -- Maven install 命令后生成war, 然后再执行 tomca:run . 所以我也不知道 它跑的是哪个版本的tomcat。  我把war解压到 本地磁盘的 tomcat8安装目录/webapps/对应工程名字/... 下   ,进入bin目录,执行startup.bat 跑起来,测了controller没问题,websocket也并没有被拦截(注意路径是"/" ?还是要加上"/工程名"),而是成功连接了。那么我想是tomcat版本的问题, POM.xml文件里修改了tomcat的build插件,最后启动tomcat的命令改成了tomcat7:run (成功了,这个版本应该够了。原来我都是tomcat:run,不知道这个有没有影响)
jar依赖:

<dependency>
         <groupId>javax.websocket</groupId>
         <artifactId>javax.websocket-api</artifactId>
         <version>1.0-rc5</version>
         <scope>provided</scope>
     </dependency>
     <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-websocket</artifactId>
        <version>4.3.9.RELEASE</version>
     </dependency>
    <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
                <scope>provided</scope>
            </dependency>
    
  </dependencies>

tomcat插件:

<build>
        <finalName>chat</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId> 
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8085</port>
                    <path>/</path>
                    <uriEncoding>UTF-8</uriEncoding>
                    <server>tomcat8</server>
                </configuration>
            </plugin>
        </plugins>
</build>

 

0
NiklausXu
NiklausXu

tomcat7建立websocket用的是BIO,建议使用tomcat9, 9更新了websocket的实现为NIO2

返回顶部
顶部