基于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作为…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
