我正在尝试使用Echo Test Websocket C ++库连接到Poco。 为了做到这一点,我的代码应该设置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
有人可以帮忙吗?
亲切的问候
答案 0 :(得分:3)
“未找到”错误是HTTP服务器返回的标准HTTP 404 Not Found。它通常意味着您请求的资源不存在。
我通过将资源从"/ws"
更改为"/"
来使您的代码正常工作:
HTTPRequest request(HTTPRequest::HTTP_GET, "/");
并添加以下行
request.set("origin", "http://www.websocket.org");
在创建新WebSocket
之前。我认为这是许多(或所有?)WebSocket服务器所期望的标头对。
答案 1 :(得分:3)
如果您想从echo服务器获得回复,您还必须确保使用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();
}
}