基于TCP的RPC服务
TCP服务器上的RPC,通过创建一个服务器进程监听传入的tcp连接,并允许用户 通过此TCP流执行RPC命令
-module(tr_server).
-author("chen").
-behaviour(gen_server).%% API
-export([start_link/1,start_link/0,get_count/0,stop/0
]).-export([init/1, handle_call/3, handle_cast/2, handle_info/2,terminate/2, code_change/3]).-define(SERVER, ?MODULE).
-define(DEFAULT_PORT, 8000).-record(state, {port, lsock, request_count = 0}).start_link(Port) ->gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []).start_link() ->start_link(?DEFAULT_PORT).
get_count() ->gen_server:call(?SERVER, get_count).
stop() ->gen_server:cast(?SERVER, stop).init([Port]) ->{ok, LSock} = gen_tcp:listen(Port, [{active, true}]),{ok, #state{port = Port, lsock = LSock}, 0}.handle_call(get_count, _From, State) ->{reply, {ok, State#state.request_count}, State}.handle_cast(stop, State) ->{stop, normal, State}.handle_info({tcp, Socket, RawData}, State) ->do_rpc(Socket, RawData),RequestCount = State#state.request_count,{noreply, State#state{request_count = RequestCount + 1}};
handle_info(timeout, #state{lsock = LSock} = State) ->{ok, _Sock} = gen_tcp:accept(LSock),{noreply, State}.terminate(_Reason, _State) ->ok.code_change(_OldVsn, State, _Extra) ->{ok, State}.do_rpc(Socket, RawData) ->try{M, F, A} = split_out_mfa(RawData),Result = apply(M, F, A),gen_tcp:send(Socket, io_lib:fwrite("~p~n", [Result]))catch_Class:Err ->gen_tcp:send(Socket, io_lib:fwrite("~p~n", [Err]))end.split_out_mfa(RawData) ->MFA = re:replace(RawData, "\r\n$", "", [{return, list}]),{match, [M, F, A]} =re:run(MFA,"(.*):(.*)\s*\\((.*)\s*\\)\s*.\s*$",[{capture, [1,2,3], list}, ungreedy]),{list_to_atom(M), list_to_atom(F), args_to_terms(A)}.args_to_terms(RawArgs) ->{ok, Toks, _Line} = erl_scan:string("[" ++ RawArgs ++ "]. ", 1),{ok, Args} = erl_parse:parse_term(Toks),Args.
处理TCP上的RPC请求
do_rpc(Socket, RawData) ->
try
{M, F, A} = split_out_mfa(RawData),
Result = apply(M, F, A),
gen_tcp:send(Socket, io_lib:fwrite("~p~n", [Result]))
catch
_Class:Err ->
gen_tcp:send(Socket, io_lib:fwrite("~p~n", [Err]))
end.
在 split_out_mfa(RawData)中,解析请求数据,随后,将模块名、函数名、参数项式列表传给内置函数apply/,执行请求中的调用。最后,该函数的返回值由io_lib:fwrite/2转换为格式化文本,用作回传给用户的响应,通过套接字发送回去。
split_out_mfa(RawData) ->
MFA = re:replace(RawData, "\r\n$", "", [{return, list}]),
{match, [M, F, A]} =
re:run(MFA,
"(.*):(.*)\s*\\((.*)\s*\\)\s*.\s*$",
[{capture, [1,2,3], list}, ungreedy]),
{list_to_atom(M), list_to_atom(F), args_to_terms(A)}.
在 split_out_mfa(RawData)中,解析请求中的字符串。
启动服务器

利用xshell向8000端口创建一个连接。

相关文章:
基于TCP的RPC服务
TCP服务器上的RPC,通过创建一个服务器进程监听传入的tcp连接,并允许用户 通过此TCP流执行RPC命令 -module(tr_server). -author("chen"). -behaviour(gen_server).%% API -export([start_link/1,start_link/0,get_count/0,stop/0 ]).-export(…...
docker报错问题解决:Error Invalid or corrupt jarfile app.jar
文章目录 1.问题描述2.问题分析3.问题解决 1.问题描述 此时处在 /home/ubuntu/app 目录下,并且在该目录下有一个 jenkins-0.0.1-SNAPSHOT.jar。 我在 /home/ubuntu/app 目录下执行了 docker 容器运行命令: # 映射 8859 端口 # 容器名为 jenkins-demo #…...
Day 09 python学习笔记
函数 装饰器 回顾内容: 函数可以作为参数进行传递函数可以作为返回值函数名称可以像变量一样进行赋值操作 装饰器:要求记住结论 引入: def play_dnf():print("你好啊,我是赛利亚,今天又是美好的一天")def p…...
力扣labuladong——一刷day02
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣876. 链表的中间结点二、力扣142. 环形链表 II三、力扣160. 相交链表四、力扣141. 环形链表 前言 一、力扣876. 链表的中间结点 /*** Definition for …...
【小白专用23.10.22 已验证】windows 11 安装PHP8.2 +Apache2.4
环境说明 windows:windows 11 x64apache: Apache/2.4.43php :php-8.2.11 一.php 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意: 1.要下载Thread Safe,否则没有php8apache2_4.dll这个文件;如果使用Apache作为服务器…...
Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务
Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务 一. CentOS7 安装配置SFTP服务器详解一、SFTP简介二、关闭防火墙三、安装SSH服务在CentOS7中,sftp只是ssh的一部分,所以采用yum来安装ssh服务即可1. 查看是否已经安装了ssh2.…...
为什么 glBegin 未被定义 未定义的标识符,使用新的 API(LearnOpenGL P2)
文章目录 弃用的 glBegin & glEnd使用新 API 的示例 弃用的 glBegin & glEnd 环境:glfw 3.3.8 glad core OpenGL 初学者在尝试使用 glBegin 和 glEnd 函数来绘制三角形时,有可能找到使用这些函数的文章、代码文献 但许多这些函数已经在OpenG…...
C++多态、虚函数、纯虚函数、抽象类
多态的概念 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 举个简单的例子:抢红包,我们每个人都只需要点击一下红包,就会抢到金额。有些人能…...
20231019_vue学习
引入vue.js: <script src"https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> vue.js <script src"https://cdn.staticfile.org/vue-router/2.7.0/vue-router.min.js"></script> 路由vue模板语法 v-html:添加html模板…...
熟练使用 Redis 的五大数据结构:Java 实战教程
入门 入门阶段主要记住 Redis 的命令,熟练使用 Redis 的 5 大数据结构就可以了。 如果没有 Redis 环境,可以直接通过这个网址https://try.redis.io/,很赞,它会给你模拟一个在线的环境可供你尽情使用! 熟练使用Redis的…...
【Linux】kill 命令使用
经常用kill -9 XXX 。一直在kill,除了kill -9 -15 ,还能做什么?今天咱们一起学习一下。 kill 命令用于删除执行中的程序或工作。 kill命令 -Linux手册页 命令选项及作用 执行令 man kill 执行命令结果 参数 -l 信号,若果…...
面试-Redis-缓存雪崩
问:什么是缓存雪崩 ? 答:缓存过期是指设置缓存时都采用了同一过期时间,导致缓存在莫一时刻同时失效,从而请求全部全部打到数据库中,导致数据库压力过大而挂机。 它与缓存击穿的区别是:缓存击穿是一个key…...
AI全栈大模型工程师(九)Function Calling 的机制
文章目录 Function Calling 的机制Function Calling 示例 1:加法计算器Function Calling 实例 2:四则混合运算计算器后记Function Calling 的机制 Function Calling 示例 1:加法计算器 需求:用户输入任意可以用加法解决的问题,都能得到计算结果。 # 加载环境变量import o…...
音乐制作软件 Ableton Live 11 Suite mac中文版功能介绍
Ableton Live 11 Suite mac是一款专业级别的音乐制作软件,它提供了多种音乐制作和编辑功能,可以帮助用户创建各种音乐作品。界面简单直观,可以方便地进行各种音乐制作操作。它提供了丰富的音乐制作工具和功能,如录音、采样、编曲、…...
v-model和.sync区别
在vue2中提供了.sync修饰符,但是在vue3中不再支持.sync,取而代之的是v-model。 1.在vue2中v-model和.sync区别: 1.相同点:都是语法糖,都可以实现父子组件中的数据的双向通信。 区别在于往回传值的时候. sync 的 $…...
django cloudflare csrf 403
网站套了cloudflare flare发现登录接口403了,csrf验证失败, debug设置为False 详细报错如下: Reason given for failure: Referer checking failed - https://xxx/login does not match any trusted origins.In general, this can occur w…...
Hive 中级练习题(40题 待更新)
前言 最近快一周没更了,主要原因是最近在忙另一件事情(关于JavaFX桌面软件开发),眼看大三上一半时间就要过去了,抓紧先学Hive,完了把 Spark 剩下的补了,还有 Kafka、Flume,任务还是…...
核酸检测人员安排
题目描述: 在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。每名采样员的效率不同,采样效率为N人/小时。由于外界变化,采样员的效率会以M人/小时为粒度发生变化,M为采样效率浮动粒度,M=N10%,输入保证N10%的结果为整数。采样员效率浮动规则:采…...
Vue组件间传值
一、父传子 子组件中定义一个props,用来取出父组件传来的值 <script>export default {props:[msg] //子组件定义props} </script> 在父组件中对子组件的自定义属性绑定父组件的变量 <template><div class"parent">//子组件&a…...
《低代码指南》——维格云和Airtable的比较
Airtable 什么是Airtable Airtable 是一个任务管理应用程序,它合并了电子表格、数据存储和模板,以帮助组织构建他们的工作流程。 适用于哪些企业/组织/人群 根据 Airtable 网站,该工具被超过 200,000 个组织的团队使用。 维格表与Airtable相比如何 Airtable作为…...
如何快速实现网页视频下载:VideoDownloadHelper开源工具的完整实战指南
如何快速实现网页视频下载:VideoDownloadHelper开源工具的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法…...
用C语言手把手教你写一个Linux虚拟键盘驱动(基于uinput模块)
用C语言手把手教你写一个Linux虚拟键盘驱动(基于uinput模块) 在嵌入式开发和系统编程领域,模拟用户输入是一个常见需求。想象一下这样的场景:你正在开发一台没有物理键盘的工业控制设备,或者需要为自动化测试创建可靠的…...
深度解析OpenCore引导加载器:现代Hackintosh架构设计与实现原理
深度解析OpenCore引导加载器:现代Hackintosh架构设计与实现原理 【免费下载链接】OpenCore-Install-Guide Repo for the OpenCore Install Guide 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Install-Guide OpenCore Install Guide项目为技术爱好…...
五大专业模糊算法:obs-composite-blur让直播画面质感全面提升
五大专业模糊算法:obs-composite-blur让直播画面质感全面提升 【免费下载链接】obs-composite-blur A comprehensive blur plugin for OBS that provides several different blur algorithms, and proper compositing. 项目地址: https://gitcode.com/gh_mirrors/…...
从‘一个向量’到‘三个向量’:为什么Transformer的Attention非得用Q、K、V?聊聊设计背后的权衡
从‘一个向量’到‘三个向量’:Transformer注意力机制中Q、K、V的设计哲学 在深度学习领域,Transformer架构彻底改变了自然语言处理的游戏规则。而其中最具革命性的设计,莫过于那个看似简单却暗藏玄机的注意力机制——特别是它独特的Q&#x…...
如何免费为Mac打造专业级音频系统?eqMac系统均衡器完整指南
如何免费为Mac打造专业级音频系统?eqMac系统均衡器完整指南 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer 🎧 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac 还在为Mac平淡无奇的音质烦恼吗?无…...
三步解锁QQ音乐加密格式:qmc-decoder让你的音乐收藏真正自由
三步解锁QQ音乐加密格式:qmc-decoder让你的音乐收藏真正自由 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾为QQ音乐下载的歌曲无法在其他播放器播放而…...
B站直播推流码获取工具:解锁专业直播体验的终极解决方案
B站直播推流码获取工具:解锁专业直播体验的终极解决方案 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码,以便可以绕开哔哩哔哩直播姬,直接在如OBS等软件中进行直播,软件同时提供定义直播分区和标题…...
深度解析:基于深度学习的远程生理信号监测技术实现与架构设计
深度解析:基于深度学习的远程生理信号监测技术实现与架构设计 【免费下载链接】rppg Benchmark Framework for fair evaluation of rPPG 项目地址: https://gitcode.com/gh_mirrors/rpp/rppg 远程光电生理信号监测(rPPG)技术通过分析面…...
ControlNet-v1-1 FP16模型终极指南:在普通显卡上实现专业级图像控制
ControlNet-v1-1 FP16模型终极指南:在普通显卡上实现专业级图像控制 【免费下载链接】ControlNet-v1-1_fp16_safetensors 项目地址: https://ai.gitcode.com/hf_mirrors/comfyanonymous/ControlNet-v1-1_fp16_safetensors ControlNet-v1-1 FP16 Safetensors…...
