WebRTC进阶-信令篇-之十六 :基于poco-c++-libraries开发实现wss的Windows客户端
一、poco实现的websocket客户端
- // 源码: poco-ws-client.cpp
- #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("localhost", 80);
- HTTPRequest request(HTTPRequest::HTTP_GET, "/?encoding=text", HTTPMessage::HTTP_1_1);
- request.set("origin", "http://www.3power-tech.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();
- }
- }
对应的测试服务端可以直接用:
\Net\samples\WebSocketServer\bin\WebSocketServer.exe
服务端的显示如下:
D:\poco-1.7.2-all\Net\samples\WebSocketServer\bin>WebSocketServer.exe
Request from 127.0.0.1:50088: GET /?encoding=text HTTP/1.1
origin: http://www.websocket.org
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: I0+ABNJn+BXMzWd5tyy9EA==
Host: localhost:9980
WebSocket connection established.
Frame received (length=21, flags=0x81).
Frame received (length=0, flags=0x0).
代码解析:
类"HTTPClientSession"实现了一个HTTP会话的客户端。
为了发送一个HTTP请求到HTTP服务端,
首先,需要初始化 HTTPClientSession 的对象,指定服务器的主机名和端口号;
然后,创建一个 HTTPRequest 对象,初始化后将这个对象作为 sendRequest()方法的对象。
sendRequest()将会返回一个输出流,它可以被用作发送的请求body;
当把这个请求body发送后,
需要创建一个HTTPResponse对象,并将其作为receiveResponse()的参数,
它会返回一个输入流,用来读取响应body;
另一个例子:
另一个例子:
- #include "stdafx.h"
- #include <iostream>
- #include <assert.h>
- #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 "Poco/Net/ServerSocket.h"
- #include "Poco/Net/NetException.h"
- #include "Poco/Exception.h"
- #include "Poco/URIStreamOpener.h"
- #include "Poco/StreamCopier.h"
- #include "Poco/Path.h"
- #include "Poco/URI.h"
- #include "Poco/SharedPtr.h"
- #include "Poco/Exception.h"
- using Poco::Net::HTTPClientSession;
- using Poco::Net::HTTPRequest;
- using Poco::Net::HTTPResponse;
- using Poco::Net::HTTPMessage;
- using Poco::Net::WebSocket;
- using Poco::Net::HTTPServerRequest;
- using Poco::Net::HTTPServerResponse;
- using Poco::Net::WebSocketException;
- using Poco::Exception;
- using Poco::URIStreamOpener;
- using Poco::StreamCopier;
- using Poco::Path;
- using Poco::URI;
- using Poco::SharedPtr;
- using Poco::Exception;
- int main(int argc, char** argv)
- {
- char buffer[1024];
- int flags;
- int n;
- std::string json = "{ \"id\":\"start\"}";
- try
- {
- //Poco::URI uri("https://10.2.175.12:8080");
- Poco::URI uri("http://10.2.175.12:8443");
- HTTPClientSession cs(uri.getHost(), uri.getPort());
- //HTTPRequest request(HTTPRequest::HTTP_GET, "/echo", "HTTP/1.1");
- HTTPRequest request(HTTPRequest::HTTP_GET, "/helloworld", "HTTP/1.1");
- HTTPResponse response;
- WebSocket *ws = new WebSocket(cs, request, response);
- ws->sendFrame(json.data(), json.size(), WebSocket::FRAME_TEXT);
- n = ws->receiveFrame(buffer, sizeof(buffer), flags);
- std::cout << "return:" << std::string(buffer, n) << "\n";
- ws->shutdown();
- }
- catch (Exception& ex)
- {
- std::cout << ex.displayText() << std::endl;
- return 1;
- }
- return 0;
- }
二、poco实现的WebSocket Security客户端
源码环境:VS2015, Poco-1.7.2-all, openSSL;
完整源码如下:
- //poco-wss-client.cpp
- #include "stdafx.h"
- #include <iostream>
- #include <assert.h>
- #include "Poco/Net/WebSocket.h"
- #include "Poco/Net/HTTPClientSession.h"
- #include "Poco/Net/HTTPRequest.h"
- #include "Poco/Net/HTTPResponse.h"
- #include "Poco/Net/ServerSocket.h"
- #include "Poco/Net/NetException.h"
- #include "Poco/Exception.h"
- #include "Poco/Net/HTTPSClientSession.h"
- #include "Poco/URIStreamOpener.h"
- #include "Poco/StreamCopier.h"
- #include "Poco/Path.h"
- #include "Poco/URI.h"
- #include "Poco/SharedPtr.h"
- #include "Poco/Exception.h"
- #include "Poco/Net/HTTPStreamFactory.h"
- #include "Poco/Net/HTTPSStreamFactory.h"
- #include "Poco/Net/FTPStreamFactory.h"
- #include "Poco/Net/SSLManager.h"
- #include "Poco/Net/KeyConsoleHandler.h"
- #include "Poco/Net/ConsoleCertificateHandler.h"
- #include "Poco/Net/AcceptCertificateHandler.h"
- #include "Poco/Net/SecureStreamSocket.h"
- #include "Poco/Net/X509Certificate.h"
- #include <memory>
- using Poco::Net::HTTPSClientSession;
- using Poco::Net::HTTPClientSession;
- using Poco::Net::HTTPRequest;
- using Poco::Net::HTTPResponse;
- using Poco::Net::HTTPServerRequest;
- using Poco::Net::HTTPServerResponse;
- using Poco::Net::WebSocket;
- using Poco::Net::WebSocketException;
- using Poco::Exception;
- using Poco::URIStreamOpener;
- using Poco::StreamCopier;
- using Poco::Path;
- using Poco::URI;
- using Poco::SharedPtr;
- using Poco::Exception;
- using Poco::Net::HTTPStreamFactory;
- using Poco::Net::HTTPSStreamFactory;
- using Poco::Net::FTPStreamFactory;
- using Poco::Net::SSLManager;
- using Poco::Net::Context;
- using Poco::Net::KeyConsoleHandler;
- using Poco::Net::PrivateKeyPassphraseHandler;
- using Poco::Net::InvalidCertificateHandler;
- using Poco::Net::ConsoleCertificateHandler;
- using Poco::Net::AcceptCertificateHandler;
- using Poco::Net::X509Certificate;
- int main(int argc, char** argv)
- {
- char buffer[1024];
- int flags;
- int n;
- std::string json ="{ \"id\":\"start\"}";
- try
- {
- SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(true);
- Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false);
- SSLManager::instance().initializeClient(0, ptrCert, ptrContext);
- //Poco::URI uri("https://10.2.175.12:8080");
- Poco::URI uri("https://10.2.175.12:8443");
- HTTPSClientSession cs(uri.getHost(), uri.getPort());
- //HTTPRequest request(HTTPRequest::HTTP_GET, "/echo", "HTTP/1.1");
- HTTPRequest request(HTTPRequest::HTTP_GET, "/helloworld", "HTTP/1.1");
- HTTPResponse response;
- WebSocket *ws = new WebSocket(cs, request, response);
- ws->sendFrame(json.data(), json.size(), WebSocket::FRAME_TEXT);
- n = ws->receiveFrame(buffer, sizeof(buffer), flags);
- std::cout << "return:" << std::string(buffer, n) << "\n";
- ws->shutdown();
- }
- catch (Exception& ex)
- {
- std::cout << ex.displayText() << std::endl;
- return 1;
- }
- return 0;
- }
它可以和simplewebsocketservercpp的wss_example进行正常通信;
一、poco实现的websocket客户端
- // 源码: poco-ws-client.cpp
- #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("localhost", 80);
- HTTPRequest request(HTTPRequest::HTTP_GET, "/?encoding=text", HTTPMessage::HTTP_1_1);
- request.set("origin", "http://www.3power-tech.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();
- }
- }
对应的测试服务端可以直接用:
\Net\samples\WebSocketServer\bin\WebSocketServer.exe
服务端的显示如下:
D:\poco-1.7.2-all\Net\samples\WebSocketServer\bin>WebSocketServer.exe
Request from 127.0.0.1:50088: GET /?encoding=text HTTP/1.1
origin: http://www.websocket.org
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: I0+ABNJn+BXMzWd5tyy9EA==
Host: localhost:9980
WebSocket connection established.
Frame received (length=21, flags=0x81).
Frame received (length=0, flags=0x0).
代码解析:
类"HTTPClientSession"实现了一个HTTP会话的客户端。
为了发送一个HTTP请求到HTTP服务端,
首先,需要初始化 HTTPClientSession 的对象,指定服务器的主机名和端口号;
然后,创建一个 HTTPRequest 对象,初始化后将这个对象作为 sendRequest()方法的对象。
sendRequest()将会返回一个输出流,它可以被用作发送的请求body;
当把这个请求body发送后,
需要创建一个HTTPResponse对象,并将其作为receiveResponse()的参数,
它会返回一个输入流,用来读取响应body;
二、poco实现的WebSocket Security客户端
源码环境:VS2015, Poco-1.7.2-all, openSSL;
完整源码如下:
- //poco-wss-client.cpp
- #include "stdafx.h"
- #include <iostream>
- #include <assert.h>
- #include "Poco/Net/WebSocket.h"
- #include "Poco/Net/HTTPClientSession.h"
- #include "Poco/Net/HTTPRequest.h"
- #include "Poco/Net/HTTPResponse.h"
- #include "Poco/Net/ServerSocket.h"
- #include "Poco/Net/NetException.h"
- #include "Poco/Exception.h"
- #include "Poco/Net/HTTPSClientSession.h"
- #include "Poco/URIStreamOpener.h"
- #include "Poco/StreamCopier.h"
- #include "Poco/Path.h"
- #include "Poco/URI.h"
- #include "Poco/SharedPtr.h"
- #include "Poco/Exception.h"
- #include "Poco/Net/HTTPStreamFactory.h"
- #include "Poco/Net/HTTPSStreamFactory.h"
- #include "Poco/Net/FTPStreamFactory.h"
- #include "Poco/Net/SSLManager.h"
- #include "Poco/Net/KeyConsoleHandler.h"
- #include "Poco/Net/ConsoleCertificateHandler.h"
- #include "Poco/Net/AcceptCertificateHandler.h"
- #include "Poco/Net/SecureStreamSocket.h"
- #include "Poco/Net/X509Certificate.h"
- #include <memory>
- using Poco::Net::HTTPSClientSession;
- using Poco::Net::HTTPClientSession;
- using Poco::Net::HTTPRequest;
- using Poco::Net::HTTPResponse;
- using Poco::Net::HTTPServerRequest;
- using Poco::Net::HTTPServerResponse;
- using Poco::Net::WebSocket;
- using Poco::Net::WebSocketException;
- using Poco::Exception;
- using Poco::URIStreamOpener;
- using Poco::StreamCopier;
- using Poco::Path;
- using Poco::URI;
- using Poco::SharedPtr;
- using Poco::Exception;
- using Poco::Net::HTTPStreamFactory;
- using Poco::Net::HTTPSStreamFactory;
- using Poco::Net::FTPStreamFactory;
- using Poco::Net::SSLManager;
- using Poco::Net::Context;
- using Poco::Net::KeyConsoleHandler;
- using Poco::Net::PrivateKeyPassphraseHandler;
- using Poco::Net::InvalidCertificateHandler;
- using Poco::Net::ConsoleCertificateHandler;
- using Poco::Net::AcceptCertificateHandler;
- using Poco::Net::X509Certificate;
- int main(int argc, char** argv)
- {
- char buffer[1024];
- int flags;
- int n;
- std::string json ="{ \"id\":\"start\"}";
- try
- {
- SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(true);
- Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false);
- SSLManager::instance().initializeClient(0, ptrCert, ptrContext);
- //Poco::URI uri("https://10.2.175.12:8080");
- Poco::URI uri("https://10.2.175.12:8443");
- HTTPSClientSession cs(uri.getHost(), uri.getPort());
- //HTTPRequest request(HTTPRequest::HTTP_GET, "/echo", "HTTP/1.1");
- HTTPRequest request(HTTPRequest::HTTP_GET, "/helloworld", "HTTP/1.1");
- HTTPResponse response;
- WebSocket *ws = new WebSocket(cs, request, response);
- ws->sendFrame(json.data(), json.size(), WebSocket::FRAME_TEXT);
- n = ws->receiveFrame(buffer, sizeof(buffer), flags);
- std::cout << "return:" << std::string(buffer, n) << "\n";
- ws->shutdown();
- }
- catch (Exception& ex)
- {
- std::cout << ex.displayText() << std::endl;
- return 1;
- }
- return 0;
- }
它可以和simplewebsocketservercpp的wss_example进行正常通信;

浙公网安备 33010602011771号