当前位置: 首页 > news >正文

做网站 绍兴展览公司网站建设

做网站 绍兴,展览公司网站建设,哪些网站做简历合适,游戏定制公司文件服务器 使用yalantinglibs,几行代码开发静态文件服务器 最近的workshop上的一个任务,就是实现一个文件服务器,只要设置下载目录之后,就可下载目录里面的文件. 看看用yalantinglibs怎么实现一个静态文件服务器的吧. coro_http::coro_http_server server(1, 9001); server.…文件服务器 使用yalantinglibs,几行代码开发静态文件服务器 最近的workshop上的一个任务,就是实现一个文件服务器,只要设置下载目录之后,就可下载目录里面的文件. 看看用yalantinglibs怎么实现一个静态文件服务器的吧. coro_http::coro_http_server server(1, 9001); server.set_static_res_dir(download, ); server.sync_start();在浏览器输入http://127.0.0.1:9001/download/index.html就能打开index.html页了,如果下载目录还有图片,则可通过curl或wget下载: curl -O http://127.0.0.1:9001/download/test.jpg wget http://127.0.0.1:9001/download/test.jpgset_static_res_dir函数有两个参数,第一个参数是设置虚目录,第二个参数设置实际文件目录,如果设置为空,则当前目录就是下载文件目录. 如果想控制每次往客户发送的数据流大小,则可通过server.set_transfer_chunked_size(chunk_size)来设置. 小文件下载优化 如果需要高并发下载海量小文件,每次都打开文件读文件流,发送完关闭文件,会导致性能瓶颈,此时可启用缓存,在内存中缓存小文件,之后请求文件就省掉了打开和关闭文件的步骤了. 缓存文件也是非常简单的,一个函数搞定. coro_http::coro_http_server server(1, 9001); server.set_static_res_dir(download, ); server.set_max_size_of_cache_files(100*1204); //缓存 server.sync_start();set_max_size_of_cache_files函数设置后,会把下载目录里面所有文件大小小于100k的文件都缓存到内存,后续客户下载文件,就直接从内存发数据,不会走文件流,多个连接请求同一文件也是零拷贝,效率很高. 因为是静态文件服务器,如果目录添加了新的文件,需要重启一下服务器. 用yalantinglibs的coro_http::coro_http_server实现的静态文件服务器,不仅可做一个文件服务器,也可做一个静态的网站页,还是很方便的,不妨试试. 原文 聊天室基于websocket的实现,服务端使用yalantinglibs.coro_http_server,前端页使用htmljs实现. 一个聊天室有以下基本功能: 1,登录/登出 2,更新用户列表 3,发送消息 4,登录,登出和更新用户列表 登录时,需要填一个用户名,填好用户名之后,js websocket client发起连接,当连接成功之后,把用户名发送到服务端,服务端要把登录用户名广播给聊天室的其它成员,其它成员收到新加入用户消息后,要更新用户列表,把新加入用户添加到用户列表中. 登出时,同样要更新列表,把登出的人从列表中删掉. 发送消息功能 聊天室用户发送一条消息,需要通过服务端广播给所有成员. 先看看前端登录部分的代码: var uname prompt(请输入用户名, user uuid(8, 16)); var ws new WebSocket(ws://127.0.0.1:9001/); ws.onopen function () {var data 系统消息:创建连接成功;let user_info { type: login, content: uname };sendMsg(user_info); };function sendMsg(msg) {var data JSON.stringify(msg);ws.send(data); }前端和服务端创建websocket连接之后,把消息类型和用户名序化成一个json串,再发送到服务端. 服务端如何处理登录消息呢? //定义json结构 //登录/登出的json结构 struct login_info_t {std::string_view type;std::string_view content;std::vectorstd::string user_list; }; REFLECTION(login_info_t, type, content, user_list); using logout_info_t login_info_t; //发送给前端的json结构 struct user_info_t {std::string_view type;std::string_view from;std::string_view content; }; REFLECTION(user_info_t, type, from, content); //收到前端消息的json结构 struct message_t {std::string type;std::string_view content; }; REFLECTION(message_t, type, content); int main() {coro_http::coro_http_server server(1, 9001);server.set_static_res_dir(, );std::mutex mtx;std::unordered_mapintptr_t, std::string conn_map;server.set_http_handlercinatra::GET(/,[](coro_http_request req,coro_http_response resp) - async_simple::coro::Lazyvoid {websocket_result result{};std::unordered_mapintptr_t, std::string map;std::string resp_str;while (true) {result co_await req.get_conn()-read_websocket();message_t msg{};struct_json::from_json(msg, result.data);if (msg.type login) {std::string user_name;{std::scoped_lock lock(mtx);if (msg.type login) {user_name std::string{msg.content};conn_map.emplace((intptr_t)req.get_conn(), user_name);}map conn_map;}if (!map.empty()) {std::vectorstd::string user_list;std::transform(map.begin(), map.end(), std::back_inserter(user_list), [](auto kv) { return kv.second; });logout_info_t info{msg.type, user_name, std::move(user_list)};struct_json::to_json(info, resp_str);}}co_await broadcast(map, resp_str);}});server.sync_start(); }服务端读到websocket消息后,先反序化json串,得到消息类型和消息内容,如果是login消息则把链接指针和用户名保存到表示聊天室用户列表的map中,后面更新用户列表和广播消息都需要该map. 更新map之后,会把map中所有的value放到一个vector中,得到一个用户名列表,接着生成一个json格式的消息,消息类型是login,消息内容是用户列表. 最后通过broadcast广播消息. 注意该map需要加锁,用户登录和登出都需要更新,该map. 登出逻辑是类似的,只不过需要从map里移除用户. 广播消息 async_simple::coro::Lazyvoid broadcast(auto conn_map, std::string resp_str) {for (auto [conn_ptr, user_name] : conn_map) {auto conn (coro_http_connection *)conn_ptr;auto ec co_await conn-write_websocket(resp_str);if (ec) {std::cout ec.message() \n;continue;}}resp_str.clear(); }广播消息很简单,遍历map,发送消息即可.这里也可用collectAll并行发送. 处理用户发送的消息 if (msg.type user) {std::string from;{std::scoped_lock lock(mtx);from conn_map.at((intptr_t)req.get_conn());map conn_map;}user_info_t info{msg.type, from, msg.content};struct_json::to_json(info, resp_str); } co_await broadcast(map, resp_str);把消息类型,谁发的消息和消息内容等json化然后广播出去即可. 前端处理广播消息 ws.onmessage function (e) {var msg JSON.parse(e.data);var sender, user_name, name_list, change_type;switch (msg.type) {case user:sender b stylecolor:green; msg.from 说: /b;break;case login:case logout:user_name msg.content;name_list msg.user_list;change_type msg.type;dealUser(user_name, change_type, name_list);return;}var data sender msg.content;listMsg(data); }; function listMsg(data) {var msg_list document.getElementById(msg_list);var msg document.createElement(p);msg.innerHTML data;msg_list.appendChild(msg);msg_list.scrollTop msg_list.scrollHeight; } function dealUser(user_name, type, name_list) {var user_list document.getElementById(user_list);var user_num document.getElementById(user_num);while (user_list.hasChildNodes()) {user_list.removeChild(user_list.firstChild);}for (var index in name_list) {var user document.createElement(p);user.innerHTML name_list[index];user_list.appendChild(user);}user_num.innerHTML name_list.length;user_list.scrollTop user_list.scrollHeight;var change type login 上线 : 下线;var data b stylecolor:red;系统消息/b: user_name 已 change;listMsg(data); } 前端收到广播消息之后,在html页中把发言者的名字和消息内容展示出来即可. 收到登录和登出消息后更新用户列表. 运行聊天室 先启动服务端,然后在浏览器中输入网址:http://127.0.0.1:9001/client.html就能看到登录聊天室的页了. 当从浏览器输入该网址之后,会从服务端下载client.html页,而coro_http_server已设置了静态文件目录: server.set_static_res_dir(, );可下载当前目录下的任意静态文件,而前端需要下载的是client.html文件,所以需要确保client.html文件在当前路径下,否则会返回一个404的错误. 完整示例代码在yalantinglibs里: 服务端: 前端html yalantinglibs使用了coro_http_server和struct_json,只需要数十行代码,就实现了一个简易的聊天室服务端.
http://www.hkea.cn/news/14276040/

相关文章:

  • 网站修改图片怎么做龙岩相亲网
  • 湖南星大建设集团有限公司网站网店营销
  • 网站 建设 现状分析新冠怎么突然不见了
  • 做网站公司上班违法吗网站设计与程序方向
  • 西安商城网站建设网站专业术语中seo意思是
  • 成都电商网站开发网络做网站如何盈利
  • 制作企业网站页面多少钱wordpress js 调用图片
  • 网站开发技术应用领域thinkphp 做网站如何
  • 游戏网站建设论文简单漂亮的博客php网站源码
  • 医院网站建设安全协议哪个建站软件比较好带论坛
  • 怎么对网站做seo优化二维码生成器加logo
  • 没有固定ip做网站n怎样建立自己的网站
  • 怎么攻击网站吗旅游最新政策
  • 本人找做钢筋笼的活网站wordpress认证机制
  • 未成年人思想道德建设网站今天郑州最新通告
  • 做网站常用什么软件dedecms中英文网站 模板
  • 建设小型网站系统开题报告用帝国做的网站
  • 河北省城乡与住房建设厅网站牛商网朱依静
  • 网站开发大揭秘wordpress关闭缓存
  • 网站建设兼职合同模板seo推广软件费用
  • 买了云服务器怎么做网站普陀做网站
  • 水墨风格网站欣赏做宠物服务的相关网站
  • 兴县网站建设有没有网站建设的教程
  • 网页网站开发平台建筑英才网官方
  • 建行的官方网站关键词优化的作用
  • angular2做的网站有智能家居网站开发
  • 重庆南川网站制作公司哪家好阳新网站建设
  • 如何申请网站优化工作龙岩公司网站建设
  • 万网域名跳转到指定网站清博舆情系统
  • 网站哪家公司做的好wordpress上传图片x