c++网络库poco 1.12.5
测试起本地服务:http服务,websockt服务(测试方式:使用代码收发消息,postman作为客户端发送消息)
本地起websocket服务
ws://127.0.0.1:9988
思路:
1. 创建websocket的http请求类(继承自Poco::Net::HTTPRequestHandler)
2. 创建websocket的http工厂类(继承自Poco::Net::HTTPRequestHandlerFactory)
3. 创建websocket的应用类(继承自Poco::Util::ServerApplication)
4. 创建应用类实例,运行。
#include <iostream>
#include "Poco/Net/HTTPServer.h"
#include "Poco/Net/HTTPServerSession.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/TCPServer.h"
#include "Poco/Net/WebSocket.h"
#include "Poco/Net/NetException.h"
#include "Poco/Net/HTTPClientSession.h"
#include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Util/ServerApplication.h"
using namespace Poco::Net;
//websocket请求的处理
class WebSocketRequestHandler : public Poco::Net::HTTPRequestHandler
{
public:
WebSocketRequestHandler(std::size_t bufSize = 1024) : _bufSize(bufSize)
{
}
virtual void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
{
try
{
WebSocket ws(request, response);
Poco::Buffer<char> buffer(_bufSize);
int flags;
int n;
do
{
n = ws.receiveFrame(buffer.begin(), static_cast<int>(buffer.size()), flags);
std::cout << "服务端接收到数据:" << buffer.begin() << std::endl;
std::string sSend = "hello, I'm WebSocket Server!";
ws.sendFrame(sSend.c_str(), sSend.size(), flags);
} while (n > 0 || (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
}
catch (WebSocketException& exc)
{
switch (exc.code())
{
case WebSocket::WS_ERR_HANDSHAKE_UNSUPPORTED_VERSION:
response.set("Sec-WebSocket-Version", WebSocket::WEBSOCKET_VERSION);
// fallthrough
case WebSocket::WS_ERR_NO_HANDSHAKE:
case WebSocket::WS_ERR_HANDSHAKE_NO_VERSION:
case WebSocket::WS_ERR_HANDSHAKE_NO_KEY:
response.setStatusAndReason(HTTPResponse::HTTP_BAD_REQUEST);
response.setContentLength(0);
response.send();
break;
}
}
}
private:
std::size_t _bufSize;
};
class WebSocketRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory
{
public:
WebSocketRequestHandlerFactory(std::size_t bufSize = 1024) : _bufSize(bufSize)
{
}
Poco::Net::HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request)
{
return new WebSocketRequestHandler(_bufSize);
}
private:
std::size_t _bufSize;
};
//创建一个本地websockt服务:ws://127.0.0.1:9988
class WebsocketServerApp : public Poco::Util::ServerApplication {
protected:
virtual int main(const std::vector<std::string>& args)
{
Poco::Net::ServerSocket ss(9988);
Poco::Net::HTTPServer svr(new WebSocketRequestHandlerFactory(), ss, new Poco::Net::HTTPServerParams());
svr.start();
waitForTerminationRequest();
svr.stop();
return Poco::Util::Application::EXIT_OK;
}
};
int main(int argc, char** argv)
{
WebsocketServerApp app;
app.run(argc, argv);
return 0;
}
自测方法
1. postman测试(推荐)
2. 代码自测
int main(int argc, char** argv)
{
//websocket server
Poco::Net::ServerSocket ss(9988); //ss(0)是系统去随机获取一个空闲端口
Poco::Net::HTTPServer server(new WebSocketRequestHandlerFactory, ss, new Poco::Net::HTTPServerParams);
server.start();
Poco::Thread::sleep(200);
std::cout << "监听到的端口号是:" << ss.address().port() << std::endl;
HTTPClientSession cs("127.0.0.1", ss.address().port());
HTTPRequest request(HTTPRequest::HTTP_GET, "/ws", HTTPRequest::HTTP_1_1);
HTTPResponse response;
WebSocket ws0 = WebSocket(cs, request, response);
WebSocket ws(std::move(ws0));
std::string payload("x");
ws.sendFrame(payload.data(), (int)payload.size());
char buffer[1024] = {};
int flags;
int n = ws.receiveFrame(buffer, sizeof(buffer), flags);
for (int i = 2; i < 20; i++)
{
payload += "x";
ws.sendFrame(payload.data(), (int)payload.size());
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
std::cout << "---客户端接收到的数据是:" << buffer << std::endl;
// ws.sendFrame(payload.data(), (int)payload.size());
// Poco::Buffer<char> pocobuffer(0);
// n = ws.receiveFrame(pocobuffer, flags);
}
for (int i = 125; i < 129; i++)
{
//payload.assign(i, 'x');
payload += "x";
ws.sendFrame(payload.data(), (int)payload.size());
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
std::cout << "---客户端接收到的数据是:" << buffer << std::endl;
// ws.sendFrame(payload.data(), (int)payload.size());
// Poco::Buffer<char> pocobuffer(0);
// n = ws.receiveFrame(pocobuffer, flags);
}
payload = "Hello, world! I'm Client!...";
ws.sendFrame(payload.data(), (int)payload.size());
//n = ws.receiveFrame(buffer, sizeof(buffer), flags);
payload = "Hello, universe!~~~~~~-----";
ws.sendFrame(payload.data(), (int)payload.size(), WebSocket::FRAME_TEXT);
//n = ws.receiveFrame(buffer, sizeof(buffer), flags);
ws.shutdown();
//n = ws.receiveFrame(buffer, sizeof(buffer), flags);
server.stop();
return 0
}
本地起http服务
http://127.0.0.1:9987
思路:
1. 创建Test01的http请求类(继承自Poco::Net::HTTPRequestHandler)
2. 创建Test01的http工厂类(继承自Poco::Net::HTTPRequestHandlerFactory)
3. 创建Test01的应用类(继承自Poco::Util::ServerApplication)
4. 创建应用类实例,运行。
#include <iostream>
#include "Poco/Net/HTTPServer.h"
#include "Poco/Net/HTTPServerSession.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/TCPServer.h"
#include "Poco/Net/WebSocket.h"
#include "Poco/Net/NetException.h"
#include "Poco/Net/HTTPClientSession.h"
#include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Util/ServerApplication.h"
using namespace Poco::Net;
//浏览器输入链接请求的处理
class Test01HttpRequestHandler : public Poco::Net::HTTPRequestHandler {
public:
virtual void handleRequest(HTTPServerRequest& req, HTTPServerResponse& resp) {
resp.setStatus(HTTPResponse::HTTP_OK);
resp.setContentType("text/html");
std::ostream& out = resp.send();
out << "<font color='blue'>Hello World!</font>";
}
};
class Test01HttpRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request)
{
return new Test01HttpRequestHandler();
}
};
//创建一个本地http服务:http://127.0.0.1:9987
class Test01ServerApp : public Poco::Util::ServerApplication
{
protected:
virtual int main(const std::vector<std::string>& args)
{
Poco::Net::ServerSocket ss(9987);
Poco::Net::HTTPServer svr(new Test01HttpRequestHandlerFactory(), ss, new Poco::Net::HTTPServerParams());
svr.start();
waitForTerminationRequest();
svr.stop();
return Poco::Util::Application::EXIT_OK;
}
};
int main(int argc, char** argv)
{
Test01ServerApp appH5;
appH5.run(argc, argv);
}