chat_server.cpp
Go to the documentation of this file.
1 #include <memory>
2 #include <thread>
3 
4 #include <test_grpc/grpcs/Chat.grpc.pb.h>
5 #include <grpcpp/grpcpp.h>
6 #include <ros/ros.h>
7 
8 namespace test_grpc
9 {
10 class ChatServer final : public grpcs::Chat::Service
11 {
12 public:
13  explicit ChatServer(const int port) : m_port(port), m_seq(0), m_thread(), m_server() {}
14 
16 
17  grpc::Status Echo(grpc::ServerContext* ctx, const grpcs::Message* request,
18  grpcs::Message* response) override
19  {
20  ROS_INFO_STREAM("received " << request->body() << " from " << request->sender());
21 
22  auto now = ros::Time::now();
23  auto stamp = response->mutable_header()->mutable_stamp();
24  stamp->set_seconds(now.sec);
25  stamp->set_nanos(now.nsec);
26  response->mutable_header()->set_seq(m_seq++);
27  response->set_sender(2);
28  response->set_body(request->body());
29  return grpc::Status::OK;
30  }
31 
32  void start()
33  {
34  m_thread = std::thread([this]() {
36  builder.SetMaxReceiveMessageSize(std::numeric_limits<int>::max());
37  builder.SetMaxSendMessageSize(std::numeric_limits<int>::max());
38  builder.AddListeningPort("0.0.0.0:" + std::to_string(m_port),
40  builder.RegisterService(this);
41  m_server = builder.BuildAndStart();
42  ROS_INFO_STREAM("Waiting for gRPC client using port " << m_port);
43  m_server->Wait();
44  ROS_INFO_STREAM("Stop waiting for gRPC client using port " << m_port);
45  });
46  }
47 
48  void stop() {
49  if (m_server) {
50  const auto deadline = std::chrono::system_clock::now() + std::chrono::seconds(1);
51  m_server->Shutdown(deadline);
52  }
53  if (m_thread.joinable())
54  {
55  m_thread.join();
56  }
57  }
58 
59 private:
60  int m_port;
61  int m_seq;
62  std::thread m_thread;
63  std::unique_ptr<grpc::Server> m_server;
64 };
65 }
66 
67 int main(int argc, char** argv)
68 {
69  ros::init(argc, argv, "chat_server");
70 
71  ros::NodeHandle pnh("~");
72  const int server_port = pnh.param<int>("server_port", 50000);
73 
75  server.start();
76  ros::spin();
77  server.stop();
78 
79  return 0;
80 }
test_grpc
Definition: chat_client.cpp:6
test_grpc::ChatServer::~ChatServer
~ChatServer()
Definition: chat_server.cpp:15
grpc::ServerContext
ctx
test_grpc::ChatServer::m_server
std::unique_ptr< grpc::Server > m_server
Definition: chat_server.cpp:63
ros::init
ROSCPP_DECL void init(const M_string &remappings, const std::string &name, uint32_t options=0)
test_grpc::ChatServer::m_thread
std::thread m_thread
Definition: chat_server.cpp:62
test_grpc::ChatServer::Echo
grpc::Status Echo(grpc::ServerContext *ctx, const grpcs::Message *request, grpcs::Message *response) override
Definition: chat_server.cpp:17
request
request
ros.h
test_grpc::ChatServer
Definition: chat_server.cpp:10
builder
builder
grpcpp.h
grpc::ServerBuilder
grpc::Status::OK
static const Status & OK
ROS_INFO_STREAM
#define ROS_INFO_STREAM(args)
port
port
server_port
server_port
test_grpc::ChatServer::m_port
int m_port
Definition: chat_server.cpp:60
response
response
server
test_grpc::ChatServer::stop
void stop()
Definition: chat_server.cpp:48
grpc::Status
ros::NodeHandle::param
T param(const std::string &param_name, const T &default_val) const
grpc::InsecureServerCredentials
std::shared_ptr< ServerCredentials > InsecureServerCredentials()
ros::spin
ROSCPP_DECL void spin()
main
int main(int argc, char **argv)
Definition: chat_server.cpp:67
test_grpc::ChatServer::m_seq
int m_seq
Definition: chat_server.cpp:61
test_grpc::ChatServer::ChatServer
ChatServer(const int port)
Definition: chat_server.cpp:13
test_grpc::ChatServer::start
void start()
Definition: chat_server.cpp:32
ros::NodeHandle
ros::Time::now
static Time now()


test_grpc
Author(s): Yuki Furuta
autogenerated on Thu Mar 13 2025 03:40:40