2012-04-22 170 views
1

我正在使用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(); 

任何幫助將非常感激

+0

根據堆棧跟蹤,U413ChatServer.java的第55行調用'WebServerSocket.accept()'。這個例外似乎發生在這裏。在WebSocket協議中需要頭部'Sec-WebSocket-Key'。請參閱http://en.wikipedia.org/wiki/WebSocket#WebSocket_protocol_handshake。我不知道爲什麼這是意想不到的 – 2012-04-22 03:50:10

+0

我已經發布了一個答案:客戶端和服務器使用不同的Websocket Protokoll版本。除了使用不同的服務器實現或不同的客戶端實現,沒有其他方法。 – andih 2012-04-22 05:43:44

回答

0

是assylias是正確的。您正在使用的websocket4j工具包確實已過時,並且需要兩個鍵和令牌值才能做出響應,由於數字除以零異常或流異常結束而失敗。