Watson Text-to-Speech через C ++ Boost Websockets - «Такой хост не известен» - PullRequest
0 голосов
/ 14 февраля 2019

Мне не удалось подключиться к службе Watson Text-To-Speech через веб-сокеты в C ++ с помощью библиотеки Boost Beast

У меня есть код, который успешно взаимодействует с echo.websocket.org через порт 80, но это не работает с 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 ++ теоретически работает нормально и работает с echo.websocket.org через порт 80, но не с 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;
}

Если URL Уотсона был неправильным, он не должен работать в Javascript.Если код C ++ был неправильным, он не должен работать с echo.websocket.org.Поэтому я понятия не имею, в чем проблема.

1 Ответ

0 голосов
/ 15 февраля 2019

baseURL в вашем коде указывает "wss", что означает защищенные веб-сокеты (SSL).Но ваш stream считается простым потоком.Если вы хотите подключиться к защищенным серверам веб-сокетов, вы должны вместо этого основывать свой код на примере websocket-client-ssl: https://github.com/boostorg/beast/blob/d43d9421a40c0251614bc45ea6dcf921a3dbaf37/example/websocket/client/sync-ssl/websocket_client_sync_ssl.cpp#L64

...