我使用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 协议与服务器的协议版本不兼容。
服务器实现了过时的(到期:2011 年 2 月 17 日)WebSocket 协议 draft-ietf-hybi-thewebsocketprotocol-latest而你的客户端可能会实现类似RFC6455(标准)的东西。
你应该看看其他实现,如Netty或Jetty WebSocketServer。
是的,亚述是对的.您使用的websocket4j套件确实已过时,需要两个密钥和令牌值才能做出响应,由于数字除以零异常或流异常结束而失败。