我一直无法使用Boost Beast库通过C++中的websockets连接到Watson的文本到语音转换服务
我的代码在80端口上成功地与echo.websocket.org接口,但它不能与Watson的url一起工作。我已经尝试使用协议的变体(http(s)、ws(s)和unspecified (适用于echo.websocket.com)),并且为了确保这一点,我已经尝试了端口80和443。
我能够成功地在Javascript中运行代码,并且使用Firefox的内置网络工具,我已经验证了它在端口443上工作。使用完全相同的URL和端口号可以得到以下结果:“不知道这样的主机。”
下面是正确建立连接的相关JS代码
var completeUrl = "wss://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?access_token=" + accessToken + "&voice=en-US_AllisonVoice";
socket = new WebSocket(completeUrl);下面的C++代码在理论上可以很好地工作,并且可以在端口80上使用echo.websocket.org,但不能与Watson一起使用。
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <cstdlib>
#include <iostream>
#include <string>
using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
namespace websocket = boost::beast::websocket; // from <boost/beast/websocket.hpp>
// Sends a WebSocket message and prints the response
int main(int argc, char** argv)
{
try
{
std::string accessToken = "XXXXX";
auto const text = "The quick brown fox jumps over the lazy dog.";
std::string baseURL = "wss://stream.watsonplatform.net/text-to-speech/api/v1/synthesize";
std::string voiceModel = "en-US_AllisonVoice";
auto const port = "443"; // port 80 for echo.websocket.org
// port 443 for watson
std::string const host = baseURL + "?access_token=" + accessToken + "&voice=" + voiceModel;
//std::string const host = "echo.websocket.org";
boost::asio::io_context ioc;
tcp::resolver resolver{ ioc };
websocket::stream<tcp::socket> ws{ ioc };
auto const results = resolver.resolve(host, port); // Problem line - "resolve: No such host is known"
std::cout << "Host resolved" << std::endl;
boost::asio::connect(ws.next_layer(), results.begin(), results.end());
ws.handshake(host, "/");
std::cout << "Connection established" << std::endl << "------------------------------" << std::endl;
ws.write(boost::asio::buffer(std::string(text)));
std::cout << "Client request: " << text << std::endl;
boost::beast::multi_buffer buffer;
ws.read(buffer);
ws.close(websocket::close_code::normal);
std::cout << "Server response: " << boost::beast::buffers(buffer.data()) << std::endl;
}
catch (std::exception const& e)
{
std::cerr << "Error: " << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}如果Watson URL是错误的,它不应该在Javascript中工作。如果C++代码是错误的,那么它就不能与echo.websocket.org一起工作。所以我不知道问题出在哪里。
发布于 2019-02-16 01:11:53
代码中的baseURL指定"wss“,这意味着安全的Websockets (SSL)。但是您的stream被删除为一个普通的流。如果您想连接到安全的websocket服务器,那么您的代码应该基于websocket-client-ssl示例:https://github.com/boostorg/beast/blob/d43d9421a40c0251614bc45ea6dcf921a3dbaf37/example/websocket/client/sync-ssl/websocket_client_sync_ssl.cpp#L64
https://stackoverflow.com/questions/54698577
复制相似问题