libx-msg-im-xsc 0.0.1 发布,X-MSG-IM 去中心化即时通信基础设施
libx-msg-im-xsc是一个基于actor模型的单进程多线程并发通信服务器框架. 它的目标是为上层应用提供一个高性能, 可测量, 并行无锁, 网络透明, 全异步的开发环境.
在X-MSG-IM系统中, 它为所有核心网元提供网络事务控制, 应用层消息处理, 透明的分布式信令跟踪(调用链)能力.
既然是到了应用层, 提供的api自然也比较友好. 因此, 你可以很快速地在这些api上构建起一个并发服务器, 看下面的例子:
服务器:
#include "XmsgTcpLog.h" #include "XmsgHttpLog.h" #include "XmsgWebSocketLog.h" #include "net-x-msg-im-auth.pb.h" #define X_MSG_N2H_PRPC_BEFOR_AUTH(__MSGMGR__, __BEGIN__, __END__, __CB__) (__MSGMGR__->reg(__BEGIN__::descriptor(), __END__::descriptor(), NULL, (void*)(__CB__), false)); static void x_msg_im_auth_simple(shared_ptr<XscChannel> channel, SptrXitp trans, shared_ptr<XmsgImAuthSimpleReq> req); int main(int argc, char **argv) { Log::setRecord(); Xsc::init(); /* libxsc-cpp初始化. */ // shared_ptr<XscTcpServer> tcpServer(new XscTcpServer("tcp-server", shared_ptr<XmsgTcpLog>(new XmsgTcpLog()))); shared_ptr<XscTcpCfg> tcpCfg(new XscTcpCfg()); tcpCfg->addr = "0.0.0.0:1224"; if (!tcpServer->startup(tcpCfg) || !tcpServer->publish()) /* tcp服务器启动. */ return EXIT_FAILURE; // shared_ptr<XscHttpServer> httpServer(new XscHttpServer("http-server", shared_ptr<XmsgHttpLog>(new XmsgHttpLog()))); shared_ptr<XscHttpCfg> httpCfg(new XscHttpCfg()); httpCfg->addr = "0.0.0.0:1225"; if (!httpServer->startup(httpCfg) || !httpServer->publish()) /* http服务器启动. */ return EXIT_FAILURE; // shared_ptr<XscWebSocketServer> webSocketServer(new XscWebSocketServer("web-socket-server", shared_ptr<XmsgWebSocketLog>(new XmsgWebSocketLog()))); shared_ptr<XscWebSocketCfg> webSocketCfg(new XscWebSocketCfg()); webSocketCfg->addr = "0.0.0.0:1226"; if (!webSocketServer->startup(webSocketCfg) || !webSocketServer->publish()) /* websocket服务器启动. */ return EXIT_FAILURE; // shared_ptr<XmsgImN2HMsgMgr> msgMgrTcp(new XmsgImN2HMsgMgr(tcpServer)); /* 服务器上的消息管理器. */ shared_ptr<XmsgImN2HMsgMgr> msgMgrHttp(new XmsgImN2HMsgMgr(httpServer)); shared_ptr<XmsgImN2HMsgMgr> msgMgrWebSocket(new XmsgImN2HMsgMgr(webSocketServer)); // X_MSG_N2H_PRPC_BEFOR_AUTH(msgMgrTcp, XmsgImAuthSimpleReq, XmsgImAuthSimpleRsp, x_msg_im_auth_simple /* 消息注册. */) X_MSG_N2H_PRPC_BEFOR_AUTH(msgMgrHttp, XmsgImAuthSimpleReq, XmsgImAuthSimpleRsp, x_msg_im_auth_simple) X_MSG_N2H_PRPC_BEFOR_AUTH(msgMgrWebSocket, XmsgImAuthSimpleReq, XmsgImAuthSimpleRsp, x_msg_im_auth_simple) // Misc::hold(); return EXIT_FAILURE; } /* 在这里处理消息. */ void x_msg_im_auth_simple(shared_ptr<XscChannel> channel, SptrXitp trans, shared_ptr<XmsgImAuthSimpleReq> req) { /** * * channel即网络信道, 这里是客户端连接. * * trans即network transaction, 一切消息都以事务开始, 以事务结束. * */ thread t([trans, req]() /* 事务总是在channel归属的线程上开始, 却可以在任意线程上结束. */ { shared_ptr<XmsgImAuthSimpleRsp> rsp(new XmsgImAuthSimpleRsp()); rsp->set_token("token"); trans->end(rsp); /* 结束事务. */ }); t.detach(); }
客户端-tcp
public static void main(String[] args) throws Exception { XmsgImAuthSimpleReq.Builder req = XmsgImAuthSimpleReq.newBuilder(); req.setUsr("usr"); // XscProtoPdu pdu = new XscProtoPdu(); /* 基于xsc协议的pdu构造. */ pdu.transm.indicator = 0x00; pdu.transm.trans = new XscProtoTransaction(); pdu.transm.trans.trans = XscProto.XSC_TAG_TRANS_BEGIN; pdu.transm.trans.stid = 0x00112233; pdu.transm.trans.msg = XmsgImAuthSimpleReq.getDescriptor().getName(); pdu.transm.trans.dat = req.build().toByteArray(); // Socket sock = new Socket("127.0.0.1", 1224); sock.getOutputStream().write(pdu.bytes()); byte by[] = new byte[0x200]; int len = sock.getInputStream().read(by); /* 这里很不严谨, 仅用于演示. */ pdu = XscProtoPdu.decode(by, 0, len); Log.info("rsp: %s", Misc.pb2str(XmsgImAuthSimpleRsp.parseFrom(pdu.transm.trans.dat))); }
客户端-http
public static void main(String[] args) throws Exception { XmsgImAuthSimpleReq.Builder req = XmsgImAuthSimpleReq.newBuilder(); req.setUsr("usr"); // HttpClient client = HttpClient.newBuilder().build(); HttpRequest request = HttpRequest.newBuilder()// .uri(URI.create("http://127.0.0.1:1225/"))// .header("x-msg-name", XmsgImAuthSimpleReq.getDescriptor().getName())// .header("x-msg-dat", Crypto.base64enc(req.build().toByteArray()))// .build(); HttpResponse<byte[]> rsp = client.send(request, HttpResponse.BodyHandlers.ofByteArray()); Log.info("rsp: %s", Misc.pb2str(XmsgImAuthSimpleRsp.parseFrom(XmsgImHttpRsp.parseFrom(rsp.body()).getDat()))); }
客户端-websocket
public static void main(String[] args) { Log.setRecord(); var httpClient = HttpClient.newHttpClient(); var wsCompletableFuture = httpClient.newWebSocketBuilder().buildAsync(URI.create("ws://127.0.0.1:1226"), new Listener() { public void onOpen(WebSocket ws) { XmsgImAuthSimpleReq.Builder req = XmsgImAuthSimpleReq.newBuilder(); req.setUsr("usr"); // XscProtoPdu pdu = new XscProtoPdu(); /* 基于xsc协议的pdu构造. */ pdu.transm.indicator = 0x00; pdu.transm.trans = new XscProtoTransaction(); pdu.transm.trans.trans = XscProto.XSC_TAG_TRANS_BEGIN; pdu.transm.trans.stid = 0x00112233; pdu.transm.trans.msg = XmsgImAuthSimpleReq.getDescriptor().getName(); pdu.transm.trans.dat = req.build().toByteArray(); // ws.sendBinary(ByteBuffer.wrap(pdu.bytes() /* 消息出栈. */), true); ws.request(1); } public CompletionStage<?> onBinary(WebSocket ws, ByteBuffer dat, boolean last) { byte by[] = new byte[dat.limit()]; dat.get(by, 0, by.length); try { XscProtoPdu pdu = XscProtoPdu.decode(by, 0, by.length); /* 解析收到的响应字节流. */ Log.info("rsp: %s", Misc.pb2str(XmsgImAuthSimpleRsp.parseFrom(pdu.transm.trans.dat))); } catch (Exception e) { Log.error(Log.trace(e)); } ws.request(1); return null; } public CompletionStage<?> onClose(WebSocket webSocket, int statusCode, String reason) { Log.debug("web-socket channel closed"); return null; } public void onError(WebSocket ws, Throwable error) { Log.debug("web-socket channel error occured: %s", Log.trace(error)); ws.request(1); } }); wsCompletableFuture.join(); Misc.hold(); }
完整的例子在这里:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
goMonitorLog v1.0.1 升级,更新支持所有的文本或者日志格式
v1.0.1更新 1、添加支持所有的日志或者文本文件的支持 2、实时对大日志文件或者文本进行实时匹配(基于Aho-Corasick 算法+Trie树+DFA 来实现) 3、添加对不存在的文件定时检测,如果又该文件会加入监听列表,基于notify模式 4、系统占用很少,性能很高
- 下一篇
安全防御主动出击,看新华三如何应对数字化时代安全挑战
【51CTO.com原创稿件】当前,数字化转型已经成为了企业核心战略,但任何事情都具有两面性,数字化给我们带来机会的同时,也随之带来许多新风险。随着5G、人工智能、互联网等新技术席卷全球,网络安全将面临更多、更新、更复杂的挑战。 网络安全产业发展空间巨大 "当前, 网络安全错综复杂,安全解决方案不可能由一家公司包打天下。因此,新华三集团选择做自己最擅长的领域,提倡研发级合作,希望搭建广阔的平台,将产品整合在一起,与合作伙伴共同向客户交付完善的安全解决方案。"近日,在2019合肥网络安全大会上,新华三集团高级副总裁、中国区总裁张力在接受媒体采访时说到。 新华三集团高级副总裁、中国区总裁张力 对于当前信息安全产业的发展情况,他表示:"我们非常坚定地看好安全板块。但是,安全产业在中国还远远没有到达应有的体量和高度,现在等级保护2.0正式实施,对安全产业来讲是个极大的机会。" 安全防御主动出击 今年4月,针对当前网络安全形势,新华三集团在领航者峰会上发布了"数字大脑计划",面向百行百业,广泛结合生态伙伴的智慧力量,朝着共同支撑客户的业务安全应用的目标,为客户提供成功数字化转型整体解决方案,助力...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度