c++ poco起本地服务,websocket服务

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

自测

在这里插入图片描述

使用的poco编译库下载链接

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用C++ Poco库创建一个简单的WebSocket服务器的示例代码: ```cpp #include <iostream> #include <Poco/Net/HTTPServer.h> #include <Poco/Net/HTTPRequestHandlerFactory.h> #include <Poco/Net/WebSocket.h> #include <Poco/Net/HTTPServerRequest.h> #include <Poco/Net/HTTPServerResponse.h> #include <Poco/Net/HTTPRequestHandler.h> #include <Poco/Net/HTTPServerParams.h> #include <Poco/Net/ServerSocket.h> #include <Poco/Util/ServerApplication.h> using namespace Poco::Net; using namespace Poco::Util; class WebSocketRequestHandler : public HTTPRequestHandler { public: void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) { WebSocket ws(request, response); char buffer[1024]; int flags; int n; do { n = ws.receiveFrame(buffer, sizeof(buffer), flags); ws.sendFrame(buffer, n, flags); } while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE); } }; class WebSocketRequestHandlerFactory : public HTTPRequestHandlerFactory { public: HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request) { return new WebSocketRequestHandler; } }; class WebSocketServerApp : public ServerApplication { protected: int main(const std::vector<std::string>& args) { ServerSocket svs(9980); HTTPServer srv(new WebSocketRequestHandlerFactory, svs, new HTTPServerParams); srv.start(); waitForTerminationRequest(); srv.stop(); return Application::EXIT_OK; } }; int main(int argc, char** argv) { WebSocketServerApp app; return app.run(argc, argv); } ``` 这段代码创建了一个简单的WebSocket服务器,它会接收客户端发送的消息,并将其原样返回给客户端。你可以根据自己的需求修改和扩展代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值