java - 为什么握手失败?

标签 java websocket

我正在使用 websocket4j 库,并且查看了有关如何在服务器应用程序中使用它的示例。我从那里获取了代码并将其实现到我当前的项目中,该项目之前使用原始套接字。无论我使用哪个客户端,我似乎都会收到一个 IOExcpetion 消息,表示握手失败。我不知道出了什么问题,因为我从示例服务器中获取了代码(这显然应该可以工作),并且我使用了一个 javascript 示例客户端来确保这不是客户端的错误。这是主要方法。

 public static void main(String args[]){
        BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
        System.out.print("PORT ( default - 1000 ): ");
        int port=1000;
        try{
            port=Integer.parseInt(b.readLine());
        }
        catch(Exception e){
            System.out.println("Wrong format. Using 1000 instead");
            port=1000;
        }
        System.out.println("Server Started. Waiting for connections");
        try{
            WebServerSocket listener=new WebServerSocket(port);
            while(true){
                WebSocket server=listener.accept();
                U413ChatServer connection=new U413ChatServer(server);
                Thread t=new Thread(connection); 
                t.start();
            }
        }
        catch(Exception e){ e.printStackTrace();
        }
    }

这就是屏幕上出现的内容

Server Started. Waiting for connections
java.io.IOException: Handshake failed
        at websocket4j.AbstractWebSocket.<init>(Unknown Source)
        at websocket4j.server.WebSocket.<init>(Unknown Source)
        at websocket4j.server.WebServerSocket.accept(Unknown Source)
        at U413ChatServer.main(U413ChatServer.java:55)
Caused by: java.io.IOException: Unexpected header field: Sec-WebSocket-Key: yfOg
xCbblVyY8ARVFyMtOw==
        at websocket4j.server.WebSocket.handshake(Unknown Source)
        at websocket4j.AbstractWebSocket$HandshakeRunner.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:47
1)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.lang.Thread.run(Thread.java:722)

第 55 行是:

WebSocket server=listener.accept();

任何帮助将不胜感激

最佳答案

您的客户端使用的 WebSocket 协议(protocol)与服务器的协议(protocol)版本不兼容。

服务器实现了过时的(过期:2011 年 2 月 17 日)WebSocket protocol draft-ietf-hybi-thewebsocketprotocol-latest 而您的客户可能会实现类似 RFC6455(标准)的东西。

您应该看看其他实现,例如 Netty or the Jetty WebSocketServer

关于java - 为什么握手失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10264801/

相关文章:

Java Restful web服务方法消费MultiPart数据抛异常

java - 如何在同一个实体类上进行单向一对多关系?

python - Websocket 线程

websocket - http.Handle ("/", websocket.Handler(EchoServer) EchoServer 可以获取ws以外的其他参数吗?

java - 使用 jsoup 访问 HTTPS url 时出现 UnknownHostException

Java 枚举等于

java - 返回对数组的引用是什么意思?

javascript - 对于一段时间内未发送消息的已连接网络套接字,chrome 是否有超时?

java - 如何使用 Spring Boot 覆盖嵌入式 Tomcat 的 websocket.textBufferSize 属性?

php - 在从 IIS 托管站点连接的 NodeJS 上对用户进行身份验证