WebRTC进阶-信令篇-之十六 :基于poco-c++-libraries开发实现wss的Windows客户端

一、poco实现的websocket客户端

  1. // 源码: poco-ws-client.cpp
  2. #include "Poco/Net/HTTPRequest.h"
  3. #include "Poco/Net/HTTPResponse.h"
  4. #include "Poco/Net/HTTPMessage.h"
  5. #include "Poco/Net/WebSocket.h"
  6. #include "Poco/Net/HTTPClientSession.h"
  7. #include <iostream>
  8. using Poco::Net::HTTPClientSession;
  9. using Poco::Net::HTTPRequest;
  10. using Poco::Net::HTTPResponse;
  11. using Poco::Net::HTTPMessage;
  12. using Poco::Net::WebSocket;
  13. int main(int args, char **argv)
  14. {
  15.   HTTPClientSession cs("localhost", 80);
  16.   HTTPRequest request(HTTPRequest::HTTP_GET, "/?encoding=text", HTTPMessage::HTTP_1_1);
  17.   request.set("origin", "http://www.3power-tech.org");
  18.   
  19.   HTTPResponse response;
  20.   try {
  21.     WebSocket* m_psock = new WebSocket(cs, request, response);
  22.     char *testStr = "Hello echo websocket!";
  23.     char receiveBuff[256];
  24.     int len = m_psock->sendFrame(testStr, strlen(testStr), WebSocket::FRAME_TEXT);
  25.     std::cout << "Sent bytes " << len << std::endl;
  26.     int flags = 0;
  27.     int rlen = m_psock->receiveFrame(receiveBuff, 256, flags);
  28.     std::cout << "Received bytes " << rlen << std::endl;
  29.     std::cout << receiveBuff << std::endl;
  30.     m_psock->close();
  31.   }
  32.     catch (std::exception &e) {
  33.       std::cout << "Exception " << e.what();
  34.   }
  35. }



对应的测试服务端可以直接用:
\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; 

另一个例子:

另一个例子:

    1. #include "stdafx.h"
    2. #include <iostream>
    3. #include <assert.h>
    4. #include "Poco/Net/HTTPRequest.h"
    5. #include "Poco/Net/HTTPResponse.h"
    6. #include "Poco/Net/HTTPMessage.h"
    7. #include "Poco/Net/WebSocket.h"
    8. #include "Poco/Net/HTTPClientSession.h"
    9. #include "Poco/Net/ServerSocket.h"
    10. #include "Poco/Net/NetException.h"
    11. #include "Poco/Exception.h"
    12. #include "Poco/URIStreamOpener.h"
    13. #include "Poco/StreamCopier.h"
    14. #include "Poco/Path.h"
    15. #include "Poco/URI.h"
    16. #include "Poco/SharedPtr.h"
    17. #include "Poco/Exception.h"
    18. using Poco::Net::HTTPClientSession;
    19. using Poco::Net::HTTPRequest;
    20. using Poco::Net::HTTPResponse;
    21. using Poco::Net::HTTPMessage;
    22. using Poco::Net::WebSocket;
    23. using Poco::Net::HTTPServerRequest;
    24. using Poco::Net::HTTPServerResponse;
    25. using Poco::Net::WebSocketException;
    26. using Poco::Exception;
    27. using Poco::URIStreamOpener;
    28. using Poco::StreamCopier;
    29. using Poco::Path;
    30. using Poco::URI;
    31. using Poco::SharedPtr;
    32. using Poco::Exception;
    33. int main(int argc, char** argv)
    34. {
    35.     char buffer[1024];
    36.     int flags;
    37.     int n;
    38.     std::string json = "{ \"id\":\"start\"}";
    39.     try
    40.     {
    41.         //Poco::URI uri("https://10.2.175.12:8080");
    42.         Poco::URI uri("http://10.2.175.12:8443");
    43.         HTTPClientSession cs(uri.getHost(), uri.getPort());
    44.         //HTTPRequest request(HTTPRequest::HTTP_GET, "/echo", "HTTP/1.1");
    45.         HTTPRequest request(HTTPRequest::HTTP_GET, "/helloworld", "HTTP/1.1");
    46.         HTTPResponse response;
    47.         WebSocket *ws = new WebSocket(cs, request, response);
    48.         ws->sendFrame(json.data(), json.size(), WebSocket::FRAME_TEXT);
    49.         n = ws->receiveFrame(buffer, sizeof(buffer), flags);
    50.         std::cout << "return:" << std::string(buffer, n) << "\n";
    51.         ws->shutdown();
    52.     }
    53.     catch (Exception& ex)
    54.     {
    55.         std::cout << ex.displayText() << std::endl;
    56.         return 1;
    57.     }
    58.     return 0;
    59. }


二、poco实现的WebSocket Security客户端
源码环境:VS2015, Poco-1.7.2-all, openSSL;
完整源码如下:

  1. //poco-wss-client.cpp
  2. #include "stdafx.h"
  3. #include <iostream>
  4. #include <assert.h>
  5. #include "Poco/Net/WebSocket.h"
  6. #include "Poco/Net/HTTPClientSession.h"
  7. #include "Poco/Net/HTTPRequest.h"
  8. #include "Poco/Net/HTTPResponse.h"
  9. #include "Poco/Net/ServerSocket.h"
  10. #include "Poco/Net/NetException.h"
  11. #include "Poco/Exception.h"
  12. #include "Poco/Net/HTTPSClientSession.h"
  13. #include "Poco/URIStreamOpener.h"
  14. #include "Poco/StreamCopier.h"
  15. #include "Poco/Path.h"
  16. #include "Poco/URI.h"
  17. #include "Poco/SharedPtr.h"
  18. #include "Poco/Exception.h"
  19. #include "Poco/Net/HTTPStreamFactory.h"
  20. #include "Poco/Net/HTTPSStreamFactory.h"
  21. #include "Poco/Net/FTPStreamFactory.h"
  22. #include "Poco/Net/SSLManager.h"
  23. #include "Poco/Net/KeyConsoleHandler.h"
  24. #include "Poco/Net/ConsoleCertificateHandler.h"
  25. #include "Poco/Net/AcceptCertificateHandler.h"
  26. #include "Poco/Net/SecureStreamSocket.h"
  27. #include "Poco/Net/X509Certificate.h"
  28. #include <memory>
  29. using Poco::Net::HTTPSClientSession;
  30. using Poco::Net::HTTPClientSession;
  31. using Poco::Net::HTTPRequest;
  32. using Poco::Net::HTTPResponse;
  33. using Poco::Net::HTTPServerRequest;
  34. using Poco::Net::HTTPServerResponse;
  35. using Poco::Net::WebSocket;
  36. using Poco::Net::WebSocketException;
  37. using Poco::Exception;
  38. using Poco::URIStreamOpener;
  39. using Poco::StreamCopier;
  40. using Poco::Path;
  41. using Poco::URI;
  42. using Poco::SharedPtr;
  43. using Poco::Exception;
  44. using Poco::Net::HTTPStreamFactory;
  45. using Poco::Net::HTTPSStreamFactory;
  46. using Poco::Net::FTPStreamFactory;
  47. using Poco::Net::SSLManager;
  48. using Poco::Net::Context;
  49. using Poco::Net::KeyConsoleHandler;
  50. using Poco::Net::PrivateKeyPassphraseHandler;
  51. using Poco::Net::InvalidCertificateHandler;
  52. using Poco::Net::ConsoleCertificateHandler;
  53. using Poco::Net::AcceptCertificateHandler;
  54. using Poco::Net::X509Certificate;
  55. int main(int argc, char** argv)
  56. {
  57.     char buffer[1024];
  58.     int flags;
  59.     int n;
  60.     std::string json ="{ \"id\":\"start\"}";
  61.     try
  62.     {
  63.         SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(true);
  64.         Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false);
  65.         SSLManager::instance().initializeClient(0, ptrCert, ptrContext);
  66.         //Poco::URI uri("https://10.2.175.12:8080");
  67.         Poco::URI uri("https://10.2.175.12:8443");
  68.         HTTPSClientSession cs(uri.getHost(), uri.getPort());
  69.         //HTTPRequest request(HTTPRequest::HTTP_GET, "/echo", "HTTP/1.1");
  70.         HTTPRequest request(HTTPRequest::HTTP_GET, "/helloworld", "HTTP/1.1");
  71.         HTTPResponse response;
  72.         WebSocket *ws = new WebSocket(cs, request, response); 
  73.         
  74.         ws->sendFrame(json.data(), json.size(), WebSocket::FRAME_TEXT);
  75.         n = ws->receiveFrame(buffer, sizeof(buffer), flags);
  76.         std::cout << "return:" << std::string(buffer, n) << "\n";
  77.         ws->shutdown();
  78.     }
  79.     catch (Exception& ex)
  80.     {
  81.         std::cout << ex.displayText() << std::endl;
  82.         return 1;
  83.     }
  84.     return 0;
  85. }

它可以和simplewebsocketservercpp的wss_example进行正常通信;

一、poco实现的websocket客户端

  1. // 源码: poco-ws-client.cpp
  2. #include "Poco/Net/HTTPRequest.h"
  3. #include "Poco/Net/HTTPResponse.h"
  4. #include "Poco/Net/HTTPMessage.h"
  5. #include "Poco/Net/WebSocket.h"
  6. #include "Poco/Net/HTTPClientSession.h"
  7. #include <iostream>
  8. using Poco::Net::HTTPClientSession;
  9. using Poco::Net::HTTPRequest;
  10. using Poco::Net::HTTPResponse;
  11. using Poco::Net::HTTPMessage;
  12. using Poco::Net::WebSocket;
  13. int main(int args, char **argv)
  14. {
  15.   HTTPClientSession cs("localhost", 80);
  16.   HTTPRequest request(HTTPRequest::HTTP_GET, "/?encoding=text", HTTPMessage::HTTP_1_1);
  17.   request.set("origin", "http://www.3power-tech.org");
  18.   
  19.   HTTPResponse response;
  20.   try {
  21.     WebSocket* m_psock = new WebSocket(cs, request, response);
  22.     char *testStr = "Hello echo websocket!";
  23.     char receiveBuff[256];
  24.     int len = m_psock->sendFrame(testStr, strlen(testStr), WebSocket::FRAME_TEXT);
  25.     std::cout << "Sent bytes " << len << std::endl;
  26.     int flags = 0;
  27.     int rlen = m_psock->receiveFrame(receiveBuff, 256, flags);
  28.     std::cout << "Received bytes " << rlen << std::endl;
  29.     std::cout << receiveBuff << std::endl;
  30.     m_psock->close();
  31.   }
  32.     catch (std::exception &e) {
  33.       std::cout << "Exception " << e.what();
  34.   }
  35. }



对应的测试服务端可以直接用:
\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;
完整源码如下:

  1. //poco-wss-client.cpp
  2. #include "stdafx.h"
  3. #include <iostream>
  4. #include <assert.h>
  5. #include "Poco/Net/WebSocket.h"
  6. #include "Poco/Net/HTTPClientSession.h"
  7. #include "Poco/Net/HTTPRequest.h"
  8. #include "Poco/Net/HTTPResponse.h"
  9. #include "Poco/Net/ServerSocket.h"
  10. #include "Poco/Net/NetException.h"
  11. #include "Poco/Exception.h"
  12. #include "Poco/Net/HTTPSClientSession.h"
  13. #include "Poco/URIStreamOpener.h"
  14. #include "Poco/StreamCopier.h"
  15. #include "Poco/Path.h"
  16. #include "Poco/URI.h"
  17. #include "Poco/SharedPtr.h"
  18. #include "Poco/Exception.h"
  19. #include "Poco/Net/HTTPStreamFactory.h"
  20. #include "Poco/Net/HTTPSStreamFactory.h"
  21. #include "Poco/Net/FTPStreamFactory.h"
  22. #include "Poco/Net/SSLManager.h"
  23. #include "Poco/Net/KeyConsoleHandler.h"
  24. #include "Poco/Net/ConsoleCertificateHandler.h"
  25. #include "Poco/Net/AcceptCertificateHandler.h"
  26. #include "Poco/Net/SecureStreamSocket.h"
  27. #include "Poco/Net/X509Certificate.h"
  28. #include <memory>
  29. using Poco::Net::HTTPSClientSession;
  30. using Poco::Net::HTTPClientSession;
  31. using Poco::Net::HTTPRequest;
  32. using Poco::Net::HTTPResponse;
  33. using Poco::Net::HTTPServerRequest;
  34. using Poco::Net::HTTPServerResponse;
  35. using Poco::Net::WebSocket;
  36. using Poco::Net::WebSocketException;
  37. using Poco::Exception;
  38. using Poco::URIStreamOpener;
  39. using Poco::StreamCopier;
  40. using Poco::Path;
  41. using Poco::URI;
  42. using Poco::SharedPtr;
  43. using Poco::Exception;
  44. using Poco::Net::HTTPStreamFactory;
  45. using Poco::Net::HTTPSStreamFactory;
  46. using Poco::Net::FTPStreamFactory;
  47. using Poco::Net::SSLManager;
  48. using Poco::Net::Context;
  49. using Poco::Net::KeyConsoleHandler;
  50. using Poco::Net::PrivateKeyPassphraseHandler;
  51. using Poco::Net::InvalidCertificateHandler;
  52. using Poco::Net::ConsoleCertificateHandler;
  53. using Poco::Net::AcceptCertificateHandler;
  54. using Poco::Net::X509Certificate;
  55. int main(int argc, char** argv)
  56. {
  57.     char buffer[1024];
  58.     int flags;
  59.     int n;
  60.     std::string json ="{ \"id\":\"start\"}";
  61.     try
  62.     {
  63.         SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(true);
  64.         Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false);
  65.         SSLManager::instance().initializeClient(0, ptrCert, ptrContext);
  66.         //Poco::URI uri("https://10.2.175.12:8080");
  67.         Poco::URI uri("https://10.2.175.12:8443");
  68.         HTTPSClientSession cs(uri.getHost(), uri.getPort());
  69.         //HTTPRequest request(HTTPRequest::HTTP_GET, "/echo", "HTTP/1.1");
  70.         HTTPRequest request(HTTPRequest::HTTP_GET, "/helloworld", "HTTP/1.1");
  71.         HTTPResponse response;
  72.         WebSocket *ws = new WebSocket(cs, request, response); 
  73.         
  74.         ws->sendFrame(json.data(), json.size(), WebSocket::FRAME_TEXT);
  75.         n = ws->receiveFrame(buffer, sizeof(buffer), flags);
  76.         std::cout << "return:" << std::string(buffer, n) << "\n";
  77.         ws->shutdown();
  78.     }
  79.     catch (Exception& ex)
  80.     {
  81.         std::cout << ex.displayText() << std::endl;
  82.         return 1;
  83.     }
  84.     return 0;
  85. }

它可以和simplewebsocketservercpp的wss_example进行正常通信;

posted @ 2016-05-10 17:48  烈火残躯  阅读(1357)  评论(0)    收藏  举报