【问题标题】:Server giving http 400 error after WebSocket handshake requestWebSocket 握手请求后服务器给出 http 400 错误
【发布时间】:2015-05-28 03:39:09
【问题描述】:

我正在尝试用 C 语言实现一个开源 CometD 库,以便能够在几乎任何给定设备上运行 CometD 客户端。

与服务器握手和通信的 Long_Polling 技术已经完成,所以从逻辑上讲,我必须将 WebSocket 选项提供给用户。

所以我获取了 Inter Web 并找到了 NoPoll 库来帮助我解决 WebSocket 部分。

感谢NoPoll 现在我可以到达服务器并敲他的门,但是当我尝试与它握手时,我总是得到这个 400 错误:

这是我的握手:

GET ws://m.zpush.ovh:8080/str/strd HTTP/1.1
Host: m.zpush.ovh:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Extension: permessage-deflate;client_max_window_bits
Sec-WebSocket-Key: Z0WLawAAAADGI3syAAAAAA==
Origin: null
Cookie: BAYEUX_BROWSER=56a9-mchhnynonz6ji8a6hs1sh49; JSESSIONID=8gz8e00htqrl15vcm3o9yi95f
Sec-WebSocket-Version: 13

这是码头错误:

WARN:oejh.HttpParser:qtp1213415012-14: badMessage: 400 for HttpChannelOverHttp@40ec53c2{r=0,c=false,a=IDLE,uri=-}

所以我再次获取了电子网络,但我没有找到任何关于它的线索。 从我读到的 jetty 通常会给出更精确的错误消息,但你会同意这个非常模糊。

它没有告诉我为什么以及我应该解决什么来实现握手。但我怀疑我在握手格式中遗漏了一些东西。

我不明白的另一件事是它说“HttpParser”,但我正在寻找 WebSocket Handshake。

对此的任何启示将不胜感激,并且与往常一样,当我得到答案时,我会使用给定的答案正确地制作一个小教程,以帮助其他开发人员并为他们提供一些代码。

PS : 如果需要,我可以在 GitHub 上上传我的代码。

感谢您的宝贵时间。

【问题讨论】:

    标签: c websocket jetty http-status-code-400 cometd


    【解决方案1】:

    很可能您的服务器配置错误,不支持 WebSocket。

    我建议您按照here 的说明启动 CometD 演示服务器,然后尝试使用您的 C 客户端。

    我刚刚尝试了您的升级请求(只是替换了主机名和端口),它工作正常。

    【讨论】:

    • 一如既往地感谢您的快速回答。关于服务器的错误配置,我完全可以,但我对此表示怀疑,因为它适用于 Java 和 JavaScript,来自 C 客户端的请求是否有区别?当我通过 Tcp 协议而不是 http 发送握手时。感谢您的宝贵时间。
    • 我用 telnet 测试了你的 TCP 升级,你只能通过 TCP 发送 HTTP 请求,所以语言不是问题,如果你做对了。
    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2013-06-05
    • 2020-03-06
    • 1970-01-01
    相关资源
    最近更新 更多