Черновата на Java websocket отказва ръкостискане

Работя с android (Java), използвайки java websockets на TooTallNate от този урок за използване на websockets на android за свързване с ws://, но аз съм получаване на грешка draft org.java_websocket.drafts.Draft_10@4560b1d0 refuses handshake. Опитах другите им чернови версии, но нито една от тях също не работи.


person CookieMonster    schedule 30.08.2016    source източник
comment
Успяхте ли да коригирате проблема?   -  person Andrii    schedule 12.12.2016
comment
края на 2017 г. и все още се сблъсквам с това   -  person Jimmy    schedule 02.11.2017
comment
Намерих решение. Добавете /websocket в края на вашата крайна точка. Когато използвате ShockJs, той добавя този допълнителен низ към вашата крайна точка. Така че без това удряте грешна крайна точка, която е валидна само за базирано на браузър приложение (очаква се http 200 вместо 101)   -  person Jimmy    schedule 02.11.2017


Отговори (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 -=-=-=- */
...

Това е, което се счупи, нито един указан протокол не причини съобщението за грешка „отказва ръкостискане“ за мен.

Моля, имайте предвид, че има няколко причини за горното „отказва ръкостискане“, но в моя случай това беше липсващият празен протокол...

person Nathanael    schedule 27.12.2017
comment
Не разбирам къде е този код. Какъв тип е това? - person Void Star; 19.02.2019
comment
Предавах протокол към моята обвивка из библиотеката. Ако не е зададен протокол; след това по подразбиране - person Nathanael; 20.02.2019
comment
Изпратих редакция на вашия отговор за партньорска проверка. Надявам се че го харесваш. Мисля, че може да помогне на потребители като мен, които имат малко по-различна ситуация (трябваше да посоча непразен протокол, но по същество това е същият основен проблем). Може също да фокусира отговора, насочвайки потребителите към проблемната повърхност на API, а не към вашия конкретен код. Чувствайте се свободни да редактирате моята редакция, ако има нужда от допълнителни промени. - person Void Star; 21.02.2019

Опитахте ли това в браузъра? Ще получите код за грешка в браузъра.

Можете да напишете прост 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);
    };
}

person Xiang.G    schedule 31.08.2016
comment
Сървърът вече има перфектно работеща версия на браузър/уебсайт, така че предполагам, че сървърът е наред, правя нативно копие на сайта за Android. - person CookieMonster; 31.08.2016

По принцип, ако имате например протокол "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);

Взето от тук

person Paulo Neves    schedule 16.01.2020