forked from archibate/co_http
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathchat_server.cpp
More file actions
84 lines (74 loc) · 2.86 KB
/
chat_server.cpp
File metadata and controls
84 lines (74 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "io_context.hpp"
#include "http_server.hpp"
#include "file_utils.hpp"
#include "reflect.hpp"
#include <unistd.h>
using namespace std::chrono_literals;
// C++ 全栈,聊天服务器
// 1. AJAX,轮询与长轮询 (OK)
// 2. WebSocket,JSON 消息
struct Message {
std::string user;
std::string content;
REFLECT(user, content);
};
struct RecvParams {
uint32_t first;
REFLECT(first);
};
std::vector<Message> messages;
stop_source recv_timeout_stop = stop_source::make();
void server() {
io_context ctx;
chdir("../static");
messages.push_back({"系统", "你好,欢迎来到小彭聊天室"});
auto server = http_server::make();
server->get_router().route("/", [](http_server::http_request &request) {
std::string response = file_get_content("index.html");
request.write_response(200, response, "text/html");
});
server->get_router().route("/favicon.ico", [](http_server::http_request &request) {
std::string response = file_get_content("favicon.ico");
request.write_response(200, response, "image/x-icon");
});
server->get_router().route("/send", [](http_server::http_request &request) {
// fmt::println("/send 收到了 {}", request.body);
messages.push_back(reflect::json_decode<Message>(request.body));
recv_timeout_stop.request_stop();
recv_timeout_stop = stop_source::make();
request.write_response(200, "OK");
});
server->get_router().route("/recv", [](http_server::http_request &request) {
auto params = reflect::json_decode<RecvParams>(request.body);
if (messages.size() > params.first) {
std::vector<Message> submessages(messages.begin() + params.first,
messages.end());
std::string response = reflect::json_encode(submessages);
// fmt::println("/recv 立即返回 {}", response);
request.write_response(200, response);
} else {
io_context::get().set_timeout(3s, [&request, params] {
std::vector<Message> submessages;
if (messages.size() > params.first) {
submessages.assign(messages.begin() + params.first,
messages.end());
}
std::string response = reflect::json_encode(submessages);
// fmt::println("/recv 延迟返回 {}", response);
request.write_response(200, response);
}, recv_timeout_stop);
}
});
// fmt::println("正在监听:http://0.0.0.0:8080");
server->do_start("0.0.0.0", "8080");
ctx.join();
}
int main() {
// try {
server();
// } catch (std::system_error const &e) {
// fmt::println("{} ({}/{})", e.what(), e.code().category().name(),
// e.code().value());
// }
return 0;
}