Работя с android (Java), използвайки java websockets на TooTallNate от този урок за използване на websockets на android за свързване с ws://
, но аз съм получаване на грешка draft org.java_websocket.drafts.Draft_10@4560b1d0 refuses handshake
. Опитах другите им чернови версии, но нито една от тях също не работи.
Черновата на Java websocket отказва ръкостискане
Отговори (3)
На първо място, искате да използвате Draft_6455
, това е текущата спецификация, останалото може или не може да работи на различни сървъри надеждно. Има конструктори за чернова на обект, които приемат List<IProtocol>
. Ако нито един указан протокол не съвпада с предложен от сървъра, ръкостискането ще бъде отказано.
public Draft_6455( List<IExtension> inputExtensions , List<IProtocol> inputProtocols )
public Draft_6455( List<IExtension> inputExtensions , List<IProtocol> inputProtocols, int inputMaxFrameSize )
Сблъсках се с подобен на вашия проблем с най-новата версия на 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);
Вие ТРЯБВА да имате поне един валиден протокол (дори ако е празен низ), или получавате грешката по-горе, която споменахте. Така че промених кода си да бъде:
...
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 -=-=-=- */
...
Това е, което се счупи, нито един указан протокол не причини съобщението за грешка „отказва ръкостискане“ за мен.
Моля, имайте предвид, че има няколко причини за горното „отказва ръкостискане“, но в моя случай това беше липсващият празен протокол...
Опитахте ли това в браузъра? Ще получите код за грешка в браузъра.
Можете да напишете прост 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);
};
}
По принцип, ако имате например протокол "my-protocol"
ArrayList<IProtocol> protocols = new ArrayList<IProtocol>();
protocols.add(new Protocol("my-protocol"));
//Uncomment below if you want to have a fallback
//protocols.add(new Protocol(""));
Draft_6455 my_draft = new Draft_6455(Collections.<IExtension>emptyList(), protocols);
Взето от тук