【问题标题】:Connect Websocket with Poco libraries将 Websocket 与 Poco 库连接
【发布时间】:2013-09-03 03:39:47
【问题描述】:

我正在尝试使用Poco C++ 库连接到Echo Test Websocket。 为此,我的代码应该设置 Websocket:

HTTPClientSession cs("echo.websocket.org");
HTTPRequest request(HTTPRequest::HTTP_GET, "/ws");
HTTPResponse response;

WebSocket* m_psock = new WebSocket(cs, request, response);
m_psock->close(); //close immidiately

但是它不起作用: 我收到这样的错误消息:

Poco::Exception: WebSocket Exception: Cannot upgrade to WebSocket connection: Not Found

有人可以帮忙吗?

【问题讨论】:

  • 我会在Poco forum上问这个问题
  • 我做到了,但没有帮助:/

标签: c++ connection websocket poco-libraries


【解决方案1】:

“未找到”错误是 HTTP 服务器返回的标准 HTTP 404 Not Found。这通常意味着您请求的资源不存在。

通过将资源从 "/ws" 更改为 "/",我让您的代码正常工作:

HTTPRequest request(HTTPRequest::HTTP_GET, "/");

并添加以下行

request.set("origin", "http://www.websocket.org");

在创建新的WebSocket 之前。我认为这是许多(或全部?)WebSocket 服务器所期望的头对。

【讨论】:

    【解决方案2】:

    如果您想从回显服务器获得回复,您还必须确保使用 Http 1.1 请求。 Poco 默认为 Http 1.0。

    HTTPRequest request(HTTPRequest::HTTP_GET, "/",HTTPMessage::HTTP_1_1);
    

    这是一个完整的例子,

    #include "Poco/Net/HTTPRequest.h"
    #include "Poco/Net/HTTPResponse.h"
    #include "Poco/Net/HTTPMessage.h"
    #include "Poco/Net/WebSocket.h"
    #include "Poco/Net/HTTPClientSession.h"
    #include <iostream>
    
    using Poco::Net::HTTPClientSession;
    using Poco::Net::HTTPRequest;
    using Poco::Net::HTTPResponse;
    using Poco::Net::HTTPMessage;
    using Poco::Net::WebSocket;
    
    
    int main(int args,char **argv)
    {
        HTTPClientSession cs("echo.websocket.org",80);    
        HTTPRequest request(HTTPRequest::HTTP_GET, "/?encoding=text",HTTPMessage::HTTP_1_1);
        request.set("origin", "http://www.websocket.org");
        HTTPResponse response;
    
    
        try {
    
            WebSocket* m_psock = new WebSocket(cs, request, response);
            char *testStr="Hello echo websocket!";
            char receiveBuff[256];
    
            int len=m_psock->sendFrame(testStr,strlen(testStr),WebSocket::FRAME_TEXT);
            std::cout << "Sent bytes " << len << std::endl;
            int flags=0;
    
            int rlen=m_psock->receiveFrame(receiveBuff,256,flags);
            std::cout << "Received bytes " << rlen << std::endl;
            std::cout << receiveBuff << std::endl;
    
            m_psock->close();
    
        } catch (std::exception &e) {
            std::cout << "Exception " << e.what();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2017-07-05
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多