2012-04-22 13 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) 

Line 55:

WebSocket server=listener.accept(); 

Любая помощь будет очень ценна

+0

Согласно трассировке стека, строка U413ChatServer.java 55 вызывает 'WebServerSocket.accept()'. Кажется, что здесь происходит исключение. И заголовок 'Sec-WebSocket-Key' требуется в протоколе WebSocket. см. http://en.wikipedia.org/wiki/WebSocket#WebSocket_protocol_handshake. Интересно, почему это неожиданно? –

+0

Я уже отправил ответ: клиент и сервер используют разные версии протоколов Websocket Protokoll. Нет другого способа, кроме использования либо другой реализации сервера, либо другой реализации клиента. – andih

ответ

1

WebSocket Протокол использует ваш клиент не совместим с версию протокола сервера.

Сервер реализует устаревшее (Expires: 17 февраля 2011) WebSocket protocol draft-ietf-hybi-thewebsocketprotocol-latest в то время как ваш клиент может осуществить что-то вроде (стандарт) RFC6455.

Вы должны смотреть на других реализациях, как Netty or the Jetty WebSocketServer

0

Да assylias является правильным. Набор websocket4j, который вы используете, действительно устарел и требует два ключа и значение токена, чтобы сделать ответ, который не работает из-за числа, деленного на нулевое исключение или исключение конца потока.

Смежные вопросы