Started work on the server, continuing client to be able to test
This commit is contained in:
@@ -8,6 +8,11 @@ add_executable(chat_server
|
|||||||
${SOURCES}
|
${SOURCES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
target_include_directories(chat_server
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/inc
|
||||||
|
)
|
||||||
|
|
||||||
target_link_libraries(chat_server
|
target_link_libraries(chat_server
|
||||||
PRIVATE
|
PRIVATE
|
||||||
proto_static
|
proto_static
|
||||||
|
|||||||
0
server/inc/.gitempty
Normal file
0
server/inc/.gitempty
Normal file
0
server/inc/logic/.gitempty
Normal file
0
server/inc/logic/.gitempty
Normal file
33
server/inc/logic/reactor.h
Normal file
33
server/inc/logic/reactor.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "messages.pb.h"
|
||||||
|
#include <absl/base/thread_annotations.h>
|
||||||
|
#include <absl/synchronization/mutex.h>
|
||||||
|
#include <grpcpp/support/server_callback.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class Service;
|
||||||
|
|
||||||
|
class ChatReactor
|
||||||
|
: public grpc::ServerBidiReactor<chat::chatMsg, chat::chatMsg> {
|
||||||
|
public:
|
||||||
|
ChatReactor(Service *service, absl::Mutex *mu,
|
||||||
|
std::vector<chat::chatMsg> *msgs);
|
||||||
|
|
||||||
|
void OnReadDone(bool ok) override;
|
||||||
|
void OnWriteDone(bool /*ok*/) override { StartRead(&m_msg); }
|
||||||
|
|
||||||
|
void OnDone() override {
|
||||||
|
std::cout << "RPC Completed";
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnCancel() override { std::cout << "RPC Cancelled"; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
Service *m_service;
|
||||||
|
chat::chatMsg m_msg;
|
||||||
|
|
||||||
|
absl::Mutex *m_mu;
|
||||||
|
std::vector<chat::chatMsg> *m_messages ABSL_GUARDED_BY(m_mu);
|
||||||
|
};
|
||||||
20
server/inc/logic/service.h
Normal file
20
server/inc/logic/service.h
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "logic/reactor.h"
|
||||||
|
#include "messages.pb.h"
|
||||||
|
#include "services.grpc.pb.h"
|
||||||
|
#include <grpcpp/server_context.h>
|
||||||
|
#include <grpcpp/support/server_callback.h>
|
||||||
|
|
||||||
|
class Service : public chat::Chat::CallbackService {
|
||||||
|
public:
|
||||||
|
~Service();
|
||||||
|
grpc::ServerBidiReactor<chat::chatMsg, chat::chatMsg> *
|
||||||
|
sendMsg(grpc::CallbackServerContext *context) override;
|
||||||
|
void sendToAll(const chat::chatMsg &msg);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<ChatReactor *> m_clients;
|
||||||
|
absl::Mutex m_mu;
|
||||||
|
std::vector<chat::chatMsg> m_messages ABSL_GUARDED_BY(m_mu);
|
||||||
|
};
|
||||||
0
server/inc/models/.gitempty
Normal file
0
server/inc/models/.gitempty
Normal file
0
server/inc/ui/.gitempty
Normal file
0
server/inc/ui/.gitempty
Normal file
0
server/lib/.gitempty
Normal file
0
server/lib/.gitempty
Normal file
@@ -1,2 +1,14 @@
|
|||||||
|
#include "logic/service.h"
|
||||||
|
#include <grpcpp/grpcpp.h>
|
||||||
|
|
||||||
int main(int argc, char *argv[]) { return 0; }
|
int main(int argc, char *argv[]) {
|
||||||
|
Service service;
|
||||||
|
std::string server_address = "0.0.0.0:50051";
|
||||||
|
grpc::ServerBuilder builder;
|
||||||
|
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
|
||||||
|
builder.RegisterService(&service);
|
||||||
|
std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
|
||||||
|
std::cout << "Server listening on " << server_address << std::endl;
|
||||||
|
server->Wait();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
0
server/src/.gitempty
Normal file
0
server/src/.gitempty
Normal file
0
server/src/logic/.gitempty
Normal file
0
server/src/logic/.gitempty
Normal file
20
server/src/logic/reactor.cpp
Normal file
20
server/src/logic/reactor.cpp
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#include "logic/reactor.h"
|
||||||
|
#include "logic/service.h"
|
||||||
|
|
||||||
|
ChatReactor::ChatReactor(Service *service, absl::Mutex *mu,
|
||||||
|
std::vector<chat::chatMsg> *msgs)
|
||||||
|
: m_service(service), m_mu(mu), m_messages(msgs) {
|
||||||
|
StartRead(&m_msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatReactor::OnReadDone(bool ok) {
|
||||||
|
if (ok) {
|
||||||
|
m_mu->lock();
|
||||||
|
m_messages->push_back(m_msg);
|
||||||
|
m_mu->unlock();
|
||||||
|
m_service->sendToAll(m_msg);
|
||||||
|
StartRead(&m_msg);
|
||||||
|
} else {
|
||||||
|
Finish(grpc::Status::OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
21
server/src/logic/service.cpp
Normal file
21
server/src/logic/service.cpp
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#include "logic/service.h"
|
||||||
|
#include "logic/reactor.h"
|
||||||
|
|
||||||
|
Service::~Service() {
|
||||||
|
for (auto *client : m_clients) {
|
||||||
|
delete client;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grpc::ServerBidiReactor<chat::chatMsg, chat::chatMsg> *
|
||||||
|
Service::sendMsg(grpc::CallbackServerContext *context) {
|
||||||
|
auto newClient = new ChatReactor(this, &m_mu, &m_messages);
|
||||||
|
m_clients.push_back(newClient);
|
||||||
|
return newClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Service::sendToAll(const chat::chatMsg &msg) {
|
||||||
|
for (auto *client : m_clients) {
|
||||||
|
client->StartWrite(&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
0
server/src/models/.gitempty
Normal file
0
server/src/models/.gitempty
Normal file
0
server/src/ui/.gitempty
Normal file
0
server/src/ui/.gitempty
Normal file
Reference in New Issue
Block a user