diff --git a/.gitignore b/.gitignore index 08f8c31c98..d43dd732a7 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,5 @@ examples/chat_client/chat_client test/basic/tests libwebsocketpp.dylib.0.1.0 -websocketpp.xcodeproj/xcuserdata/* \ No newline at end of file +websocketpp.xcodeproj/xcuserdata/* +examples/echo_client/echo_client diff --git a/examples/echo_client/Makefile b/examples/echo_client/Makefile new file mode 100644 index 0000000000..2be6a3b967 --- /dev/null +++ b/examples/echo_client/Makefile @@ -0,0 +1,23 @@ +CFLAGS = -O2 +LDFLAGS = + +CXX ?= c++ +SHARED ?= "1" + +ifeq ($(SHARED), 1) + LDFLAGS := $(LDFLAGS) -lboost_system -lboost_thread -lwebsocketpp +else + LDFLAGS := $(LDFLAGS) -lboost_system -lboost_thread -lboost_date_time -lboost_regex -lboost_random ../../libwebsocketpp.a +endif + +echo_client: echo_client.o echo_client_handler.o + $(CXX) $(CFLAGS) $^ -o $@ $(LDFLAGS) + +%.o: %.cpp + $(CXX) -c $(CFLAGS) -o $@ $^ + +# cleanup by removing generated files +# +.PHONY: clean +clean: + rm -f *.o echo_client diff --git a/examples/echo_client/echo_client.cpp b/examples/echo_client/echo_client.cpp new file mode 100644 index 0000000000..e0f05de88e --- /dev/null +++ b/examples/echo_client/echo_client.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "echo_client_handler.hpp" + +#include +#include +#include + +#include + +using boost::asio::ip::tcp; +using namespace websocketecho; + +int main(int argc, char* argv[]) { + std::string uri; + + /*if (argc != 2) { + std::cout << "Usage: `echo_client test_url`" << std::endl; + } else { + uri = argv[1]; + }*/ + + echo_client_handler_ptr c(new echo_client_handler()); + + try { + boost::asio::io_service io_service; + + websocketpp::client_ptr client(new websocketpp::client(io_service,c)); + + client->init(); + client->set_header("User Agent","WebSocket++/2011-09-25"); + + client->connect("ws://localhost:9001/getCaseCount"); + + io_service.run(); + + std::cout << "done" << std::endl; + + } catch (std::exception& e) { + std::cerr << "Exception: " << e.what() << std::endl; + } + + return 0; +} diff --git a/examples/echo_client/echo_client_handler.cpp b/examples/echo_client/echo_client_handler.cpp new file mode 100644 index 0000000000..ab43350161 --- /dev/null +++ b/examples/echo_client/echo_client_handler.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "echo_client_handler.hpp" + +#include + +using websocketecho::echo_client_handler; +using websocketpp::client_session_ptr; + +void echo_client_handler::on_open(session_ptr s) { + std::cout << "Successfully connected: " << s->get_resource() << std::endl; +} + +void echo_client_handler::on_close(session_ptr s,uint16_t status,const std::string &reason) { + std::cout << "client was disconnected" << std::endl; +} + +void echo_client_handler::on_message(session_ptr s,const std::string &msg) { + if (s->get_resource() == "/getCaseCount") { + std::cout << "msg |" << msg.substr(1,msg.size()-2) << "|" << std::endl; + m_case_count = atoi(msg.substr(1,msg.size()-2).c_str()); + } else { + s->send(msg); + } +} + +void echo_client_handler::on_message(session_ptr s, + const std::vector &data) { + s->send(data); +} \ No newline at end of file diff --git a/examples/echo_client/echo_client_handler.hpp b/examples/echo_client/echo_client_handler.hpp new file mode 100644 index 0000000000..a2c3c385c3 --- /dev/null +++ b/examples/echo_client/echo_client_handler.hpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2011, Peter Thorson. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the WebSocket++ Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef ECHO_CLIENT_HANDLER_HPP +#define ECHO_CLIENT_HANDLER_HPP + +// com.zaphoyd.websocketpp.chat protocol +// +// client messages: +// alias [UTF8 text, 16 characters max] +// msg [UTF8 text] +// +// server messages: +// {"type":"msg","sender":"","value":"" } +// {"type":"participants","value":[,...]} + +#include + +#include "../../src/websocketpp.hpp" +#include "../../src/websocket_connection_handler.hpp" + +#include +#include +#include + +using websocketpp::session_ptr; + +namespace websocketecho { + +class echo_client_handler : public websocketpp::connection_handler { +public: + echo_client_handler() : m_case_count(0) {} + virtual ~echo_client_handler() {} + + // ignored for clients? + void validate(session_ptr s) {} + + // connection to chat room complete + void on_open(session_ptr s); + + // connection to chat room closed + void on_close(session_ptr s,uint16_t status,const std::string &reason); + + // got a new message from server + void on_message(session_ptr s,const std::string &msg); + + // ignore messages + void on_message(session_ptr s,const std::vector &data); +private: + int m_case_count; +}; + +typedef boost::shared_ptr echo_client_handler_ptr; + +} +#endif // ECHO_CLIENT_HANDLER_HPP