2016-08-30 3 views
4

Я работаю на Android (Java) с использованием TooTallNate's java websockets от this tutorial потреблять WebSockets на андроид, чтобы соединиться с ws://, но я получаю сообщение об ошибке draft [email protected] refuses handshake. Я попробовал другие варианты, но ни один из них не работал.Java проект WebSocket отказывается рукопожатия

+2

были вам удалось решить проблему? – Andrii

+0

конец 2017 года, и я все еще сталкиваюсь с этим – Jimmy

+0

Найден решение. Добавьте/websocket в конце вашей конечной точки. Когда вы используете ShockJs, он добавляет дополнительную строку к вашей конечной точке. Таким образом, без этого вы попадаете в неправильную конечную точку, которая действительна только для браузера (ожидаемый http 200 вместо 101) – Jimmy

ответ

0

Вы попробовали это на broswer? Вы получите код ошибки на broswer.

Вы можете написать простой файл js, чтобы начать и проверить, находится ли эта проблема на сервере или находится в приложении.

Это демо, это не займет у вас слишком много времени.

<script type="text/javascript"> 
function send() { 
    var url = 'ws://192.168.1.101:8080/WebSocket/echo'; 
    var vs = new WebSocket(url); 
    vs.onopen = function(evt){ 
     vs.send(te.value) 
    }; 
    vs.onmessage = function(evt){ 
     alert(evt.data); 
    }; 
} 

+0

У сервера уже есть отлично работающая версия браузера/веб-сайта, поэтому я предполагаю, что сервер в порядке, я делаю родной андроидной копии сайта. – CookieMonster

0

Прежде всего, вы хотите использовать Draft6455, это текущая спецификация, остальные могут или не могут работать на разных серверах надежно.

Однако, я столкнулся с подобной проблемой с новейшей версией Java WebSockets TooTallNate, мой код был так:

knownExtensions = new java.util.ArrayList(); 
    knownProtocols = new java.util.ArrayList(); 
    if(this._protocol){ 
     knownProtocols.add(new org.java_websocket.protocols.Protocol(this._protocol)); 
    } 

    this._socket = new _WebSocket(uri, new org.java_websocket.drafts.Draft_6455(knownExtensions, knownProtocols), toHashMap(this._headers), this._timeout); 

Проблема закончилась, что, когда вы отправляете в списке knownProtocols, вы MUST имеют хотя бы один действительный протокол (даже если это пустая строка), или вы получаете указанную выше ошибку, на которую вы ссылаетесь. Поэтому я изменил код, чтобы быть:

... 
if(this._protocol){ 
    knownProtocols.add(new org.java_websocket.protocols.Protocol(this._protocol)); 
} 
/* -=-=-=- NEW ADDED CODE -=-=-=- */ 
else { 
    knownProtocols.add(new org.java_websocket.protocols.Protocol("")); 
} 
/* -=-=-=- END NEW ADDED CODE -=-=-=- */ 
... 

Это то, что сломалось, не протокол указанного не вызвало сообщение об ошибке «отказывается рукопожатия» для меня.

Пожалуйста, обратите внимание, что есть несколько причин выше «отказывается рукопожатия», но в моем случае это был недостающий пустой протокол ...