Java 为什么握手失败了?

Java 为什么握手失败了?,java,websocket,Java,Websocket,我正在使用websocket4j库,我看了一个如何在服务器应用程序中使用它的示例。我从那里获取代码,并将其应用到我当前的项目中,该项目以前使用原始套接字。无论我使用哪一个客户机,我似乎都会收到一份通知,说握手失败了。我不知道哪里出了问题,因为我从示例服务器获取了代码(这显然是应该工作的),并且我使用了一个javascript示例客户机来确保这不是客户机的错误。这里是主要的方法 public static void main(String args[]){ BufferedRea

我正在使用websocket4j库,我看了一个如何在服务器应用程序中使用它的示例。我从那里获取代码,并将其应用到我当前的项目中,该项目以前使用原始套接字。无论我使用哪一个客户机,我似乎都会收到一份通知,说握手失败了。我不知道哪里出了问题,因为我从示例服务器获取了代码(这显然是应该工作的),并且我使用了一个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)

非常感谢您的帮助

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

服务器执行过期的(过期日期:2011年2月17日) 而您的客户可能会实现类似(标准)的东西


您应该了解一下其他实现,如客户机使用的WebSocket协议与服务器的协议版本不兼容

服务器执行过期的(过期日期:2011年2月17日) 而您的客户可能会实现类似(标准)的东西


您应该看看其他的实现,如

是的,assylias是正确的。您正在使用的websocket4j工具包确实已经过时,需要两个键和令牌值才能做出响应,这会由于数字除以零异常或流结束异常而失败。

是assylias是正确的。您正在使用的websocket4j工具包确实已经过时,需要两个键和令牌值才能做出响应,这是由于数字除以零异常或流结束异常而失败。

根据堆栈跟踪,U413ChatServer.java的第55行调用
WebServerSocket.accept()
。这里似乎出现了例外情况。并且在WebSocket协议中需要标头
Sec WebSocket键
。看见我想知道为什么这是出乎意料的我已经发布了一个答案:客户端和服务器使用不同的Websocket协议版本。除了使用不同的服务器实现或不同的客户端实现之外,没有其他方法。根据堆栈跟踪,U413ChatServer.java的第55行调用
WebServerSocket.accept()
。这里似乎出现了例外情况。并且在WebSocket协议中需要标头
Sec WebSocket键
。看见我想知道为什么这是出乎意料的我已经发布了一个答案:客户端和服务器使用不同的Websocket协议版本。除了使用不同的服务器实现或客户机实现之外,没有其他方法。
WebSocket server=listener.accept();