Я использовал библиотеку 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();
Любая помощь будет очень ценна
Согласно трассировке стека, строка U413ChatServer.java 55 вызывает 'WebServerSocket.accept()'. Кажется, что здесь происходит исключение. И заголовок 'Sec-WebSocket-Key' требуется в протоколе WebSocket. см. http://en.wikipedia.org/wiki/WebSocket#WebSocket_protocol_handshake. Интересно, почему это неожиданно? –
Я уже отправил ответ: клиент и сервер используют разные версии протоколов Websocket Protokoll. Нет другого способа, кроме использования либо другой реализации сервера, либо другой реализации клиента. – andih