/* * ws_connect.cpp * Author: Benjamin Sergeant * Copyright (c) 2017-2018 Machine Zone, Inc. All rights reserved. */ #include #include #include #include using namespace ix; namespace { void log(const std::string& msg) { std::cout << msg << std::endl; } class WebSocketConnect { public: WebSocketConnect(const std::string& _url); void subscribe(const std::string& channel); void start(); void stop(); void sendMessage(const std::string& text); private: std::string _url; ix::WebSocket _webSocket; }; WebSocketConnect::WebSocketConnect(const std::string& url) : _url(url) { ; } void WebSocketConnect::stop() { _webSocket.stop(); } void WebSocketConnect::start() { _webSocket.configure(_url); std::stringstream ss; log(std::string("Connecting to url: ") + _url); _webSocket.setOnMessageCallback( [this](ix::WebSocketMessageType messageType, const std::string& str, ix::WebSocketErrorInfo error) { std::stringstream ss; if (messageType == ix::WebSocket_MessageType_Open) { log("ws_connect: connected"); } else if (messageType == ix::WebSocket_MessageType_Close) { log("ws_connect: disconnected"); } else if (messageType == ix::WebSocket_MessageType_Message) { ss << "ws_connect: received message: " << str; log(ss.str()); } else if (messageType == ix::WebSocket_MessageType_Error) { ss << "Connection error: " << error.reason << std::endl; ss << "#retries: " << error.retries << std::endl; ss << "Wait time(ms): " << error.wait_time << std::endl; ss << "HTTP Status: " << error.http_status << std::endl; log(ss.str()); } else { ss << "Invalid ix::WebSocketMessageType"; log(ss.str()); } }); _webSocket.start(); } void WebSocketConnect::sendMessage(const std::string& text) { _webSocket.send(text); } void interactiveMain(const std::string& url) { std::cout << "Type Ctrl-D to exit prompt..." << std::endl; WebSocketConnect webSocketChat(url); webSocketChat.start(); while (true) { std::string text; std::cout << "> " << std::flush; std::getline(std::cin, text); if (!std::cin) { break; } webSocketChat.sendMessage(text); } std::cout << std::endl; webSocketChat.stop(); } } int main(int argc, char** argv) { if (argc != 2) { std::cerr << "Usage: ws_connect " << std::endl; return 1; } std::string url = argv[1]; Socket::init(); interactiveMain(url); return 0; }