Skip to content

Commit

Permalink
Wangle Echo Server & Client
Browse files Browse the repository at this point in the history
  • Loading branch information
claudiouzelac committed Aug 4, 2016
1 parent 43761c5 commit 13dca20
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 0 deletions.
25 changes: 25 additions & 0 deletions examples/wangle/echo/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
licenses(["notice"])

cc_binary(
name = "echo_server",
visibility = ["//visibility:public"],
srcs = ["EchoServer.cpp"],
deps = [
"//third_party/wangle:wangle",
"//third_party/folly:folly",
"//third_party/glog:glog"
]
)

cc_binary(
name = "echo_client",
visibility = ["//visibility:public"],
srcs = ["EchoClient.cpp"],
deps = [
"//third_party/wangle:wangle",
"//third_party/folly:folly",
"//third_party/glog:glog"
]
)


77 changes: 77 additions & 0 deletions examples/wangle/echo/EchoClient.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#include <gflags/gflags.h>
#include <iostream>
#include <wangle/bootstrap/ClientBootstrap.h>
#include <wangle/channel/AsyncSocketHandler.h>
#include <wangle/channel/EventBaseHandler.h>
#include <wangle/codec/LineBasedFrameDecoder.h>
#include <wangle/codec/StringCodec.h>

using namespace folly;
using namespace wangle;

DEFINE_int32(port, 8080, "echo server port");
DEFINE_string(host, "::1", "echo server address");

typedef Pipeline<folly::IOBufQueue&, std::string> EchoPipeline;

// the handler for receiving messages back from the server
class EchoHandler : public HandlerAdapter<std::string> {
public:
virtual void read(Context* ctx, std::string msg) override {
std::cout << "received back: " << msg;
}
virtual void readException(Context* ctx, exception_wrapper e) override {
std::cout << exceptionStr(e) << std::endl;
close(ctx);
}
virtual void readEOF(Context* ctx) override {
std::cout << "EOF received :(" << std::endl;
close(ctx);
}
};

// chains the handlers together to define the response pipeline
class EchoPipelineFactory : public PipelineFactory<EchoPipeline> {
public:
EchoPipeline::Ptr newPipeline(std::shared_ptr<AsyncTransportWrapper> sock) {
auto pipeline = EchoPipeline::create();
pipeline->addBack(AsyncSocketHandler(sock));
pipeline->addBack(
EventBaseHandler()); // ensure we can write from any thread
pipeline->addBack(LineBasedFrameDecoder(8192, false));
pipeline->addBack(StringCodec());
pipeline->addBack(EchoHandler());
pipeline->finalize();
return pipeline;
}
};

int main(int argc, char** argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);

ClientBootstrap<EchoPipeline> client;
client.group(std::make_shared<wangle::IOThreadPoolExecutor>(1));
client.pipelineFactory(std::make_shared<EchoPipelineFactory>());
auto pipeline = client.connect(SocketAddress(FLAGS_host, FLAGS_port)).get();

try {
while (true) {
std::string line;
std::getline(std::cin, line);
if (line == "") {
break;
}

pipeline->write(line + "\r\n").get();
if (line == "bye") {
pipeline->close();
break;
}
}
} catch (const std::exception& e) {
std::cout << exceptionStr(e) << std::endl;
}

return 0;
}

48 changes: 48 additions & 0 deletions examples/wangle/echo/EchoServer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include <gflags/gflags.h>
#include <wangle/bootstrap/ServerBootstrap.h>
#include <wangle/channel/AsyncSocketHandler.h>
#include <wangle/codec/LineBasedFrameDecoder.h>
#include <wangle/codec/StringCodec.h>

using namespace folly;
using namespace wangle;

DEFINE_int32(port, 8080, "echo server port");

typedef Pipeline<IOBufQueue&, std::string> EchoPipeline;

// the main logic of our echo server; receives a string and writes it straight
// back
class EchoHandler : public HandlerAdapter<std::string> {
public:
virtual void read(Context* ctx, std::string msg) override {
std::cout << "handling " << msg << std::endl;
write(ctx, msg + "\r\n");
}
};

// where we define the chain of handlers for each messeage received
class EchoPipelineFactory : public PipelineFactory<EchoPipeline> {
public:
EchoPipeline::Ptr newPipeline(std::shared_ptr<AsyncTransportWrapper> sock) {
auto pipeline = EchoPipeline::create();
pipeline->addBack(AsyncSocketHandler(sock));
pipeline->addBack(LineBasedFrameDecoder(8192));
pipeline->addBack(StringCodec());
pipeline->addBack(EchoHandler());
pipeline->finalize();
return pipeline;
}
};

int main(int argc, char** argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);

ServerBootstrap<EchoPipeline> server;
server.childPipeline(std::make_shared<EchoPipelineFactory>());
server.bind(FLAGS_port);
server.waitForStop();

return 0;
}

13 changes: 13 additions & 0 deletions examples/wangle/echo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Wangle Examples

This directory provides examples of using the Wangle Echo Server.

## Compiling

Echo Server:

`bazel build //examples/wangle/echo:echo_server`

Echo Client:

`bazel build //examples/wangle/echo:echo_client`
18 changes: 18 additions & 0 deletions third_party/wangle/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,23 @@ cc_library(
]
)

cc_library(
name = "codec",
visibility = ["//visibility:public"],
includes = [
"upstream",
],
hdrs = glob(["upstream/wangle/codec/*.h"]),
srcs = [
"upstream/wangle/codec/LineBasedFrameDecoder.cpp",
"upstream/wangle/codec/LengthFieldPrepender.cpp",
"upstream/wangle/codec/LengthFieldBasedFrameDecoder.cpp"
],
deps = [
":channel"
]
)

# Disabled because dependings on boost/thread
#
# cc_test(
Expand Down Expand Up @@ -119,5 +136,6 @@ cc_library(
":channel",
":concurrent",
":ssl",
":codec"
]
)

0 comments on commit 13dca20

Please sign in to comment.