2016-08-30 96 views
4

我正在使用Android(Java)TooTallNate's java websocketsthis tutorial使用android上的websockets與ws://連接,但我收到錯誤draft [email protected] refuses handshake。我嘗試了他們的其他草稿版本,但他們都沒有工作。Java websocket稿件拒絕握手

+2

是你設法解決這個問題? – Andrii

+0

2017年底我仍然面臨這個 – Jimmy

+0

找到了解決辦法。在端點的末尾添加/ websocket。當您使用ShockJs時,它將額外的字符串添加到您的端點。所以,如果沒有,你打錯了端點,這是有效的只適用於基於瀏覽器的應用程序(預期http200而不是101) – Jimmy

回答

0

你試過這個在瀏覽器上嗎?你會在大衣上看到一個錯誤的代碼。

您可以編寫一個簡單的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

服務器已經有一個完美的工作瀏覽器/網站版本,所以我假設服務器是好的,我做了一個網站的原生android副本。 – CookieMonster

0

首先,你要使用的Draft6455,它是當前規格,其餘可能會或可能不會在不同服務器上運行可靠。

不過,我遇到了與TooTallNate的Java的WebSockets的最新版本類似的問題,我的代碼是像這樣:

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列表發送,您必須至少有一個有效的協議(即使它是一個空字符串),或者你得到你引用的上述錯誤。所以我改變我的代碼是:

... 
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 -=-=-=- */ 
... 

這是什麼壞了,沒有指定協議導致「拒絕握手」錯誤消息對我來說。

請注意,有幾個原因,上述的「拒絕握手」,但在我的情況下,它是缺失的空白協議...