【问题标题】:Java websocket draft refuses handshakeJava websocket 草稿拒绝握手
【发布时间】:2016-08-30 18:19:29
【问题描述】:

我正在使用来自this tutorialTooTallNate's java websockets 在android(Java) 上使用websockets 来连接ws://,但我收到错误draft org.java_websocket.drafts.Draft_10@4560b1d0 refuses handshake。我尝试了他们的其他草稿版本,但都没有工作。

【问题讨论】:

  • 你解决了这个问题吗?
  • 2017 年底,我仍然面临这个问题
  • 找到了解决方案。在端点的末尾添加 /websocket。当您使用 ShockJs 时,它会将额外的字符串添加到您的端点。因此,如果没有,您会遇到错误的端点,该端点仅对基于浏览器的应用程序有效(预期 http 200 而不是 101)

标签: java android java-websocket


【解决方案1】:

首先,您要使用Draft_6455,它是当前规范,其余的可能会或可能不会在不同的服务器上可靠地工作。草稿对象的构造函数采用List<IProtocol>。如果没有指定的协议与服务器提供的协议匹配,则握手将被拒绝。

public Draft_6455( List<IExtension> inputExtensions , List<IProtocol> inputProtocols )
public Draft_6455( List<IExtension> inputExtensions , List<IProtocol> inputProtocols, int inputMaxFrameSize )

我在使用最新版本的 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);

必须至少有一个有效的协议(即使它是一个空字符串),否则您会收到您引用的上述错误。所以我将代码更改为:

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

这就是问题,没有指定协议导致我出现“拒绝握手”错误消息。

请注意,上述“拒绝握手”有几个原因,但在我的情况下,是缺少空协议...

【讨论】:

  • 我不明白这段代码在哪里。 “这个”是什么类型?
  • 我正在将一个协议传递给我的库周围的包装器。如果未设置协议;然后我默认为“”
  • 我提交了对您的答案的编辑以供同行评审。我希望你喜欢它。我认为它可以帮助像我这样情况略有不同的用户(我需要指定一个非空协议,但本质上它是相同的潜在问题)。它还可能集中答案,将用户指向有问题的 API 表面,而不是您的特定代码。如果需要一些额外的更改,请随时编辑我的编辑。
【解决方案2】:

你在浏览器上试过这个吗?您将在浏览器上收到错误代码。

你可以写一个简单的js文件启动,测试一下这个问题是在服务器上还是在app上。

这是一个演示,不会花你太多时间。

<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);
    };
}

【讨论】:

  • 服务器已经有一个完美运行的浏览器/网站版本,所以我假设服务器很好,我正在制作网站的原生 android 副本。
【解决方案3】:

基本上,如果您有例如协议“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);

取自here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 2021-11-26
    • 2016-04-10
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2012-11-25
    相关资源
    最近更新 更多