Organizations

8 results for Erlang
  • 用于自定义的初始化打包 Rebar3 项目: # 构建脚本 vim GenRebar3Project.py 脚本内容: # !/usr/bin/python # -*- coding: UTF-8 -*- # =================================================== # 构建 Rebar3 项目工程 # =================================================== import argparse import os import re import shutil import time import urllib.request import subprocess from datetime import datetime ROOT_DIR = os.path.dirname(os.path.realpath(__file__)) REBAR_CDN = "https://s3.amazonaws.com/rebar3/rebar3" REBAR_EXE = "rebar3" REBAR_DOC = "https://rebar3.org/docs/getting-started" ERL_SCRIPT = "escript.exe" if os.name == "nt" else "escript" ERL_EXE = "werl.exe" if os.name == "nt" else "erl" # 重写配置文件 def rewrite_rebar_config(project_dir, project_name): rebar_config = os.
    Erlang Created Sat, 17 Aug 2024 02:17:15 +0800
  • Erlang进阶(五) 这里来到了关键 Erlang 概念部分, OTP 最重要的模板 Supervisor 说明. Erlang 之前讲过天然带有 Actor 支持, 那么在启动将模块(module) 声明以下的 behaviour 就能达成注册到 Erlang 进程: %%%------------------------------------------------------------------- %%% @author MeteorCat %%% @copyright (C) 2024, <COMPANY> %%% @doc %%% @end %%%------------------------------------------------------------------- -module(sys_gateway_supervisor). % 声明模块 -author("MeteorCat"). -behaviour(supervisor). % 声明为 Actor % 默认 supervisor 的必须实现的回调 -export([start_link/0, init/1]). 这里就是编写 sys_gateway_supervisor.erl 文件, 内部已经实现 Actor 模式, 当然内部还有些需要说明. supervisor 是重点中的重点, 基本可以视作为 Erlang 的核心. 如果点击进源码就会看到内部的另外实现: -behaviour(gen_server). %% External exports -export([start_link/2, start_link/3, start_child/2, restart_child/2, delete_child/2, terminate_child/2, which_children/1, count_children/1, check_childspecs/1, check_childspecs/2, get_childspec/2]).
    Erlang Created Wed, 17 Jul 2024 20:19:07 +0800
  • Erlang进阶(四) Erlang 内置 gen_tcp|gen_udp 可以作为 tcp|udp 网络监听模块, 这里主要讲解的是 gen_tcp 模块, udp 方面相对来说接触的比较少. % 网络请求入口 net_main() -> ListenPort = 6000, % 访问端口 ListenOpts = [ binary, % 二进制流 % 如果为 true 为主动模式, 所有接收数据都转发到声明监听的进程当中, 默认为主动模式 % 如果为 false 为被动模式, 接收到消息之后需要手动调用 gen_tcp:recv 读取信息 % 适合定制化 acceptor 处理, 一般游戏服务器都需要构建管理自己连接池, 所以该配置会关掉 {active, false}, % 系统级别帮你保证客户端和服务端的连接活跃性, 默认是关闭的 % 游戏服务一般都是自己做心跳维护的, 所以不需要系统做连接保活 {keepalive, false}, % 数据包直接推送给客户端而不会等待凑足待发送队列一次性推送 % 一般非高频网络服务会写入待发送队列之后一次性推送来提高效率, 游戏服务之类不需要 {nodelay, true}, % Erlang 会保证将TCP数据原封不动推送回客户端 {packet, 0}, % 允许对本地端口进行复用 {reuseaddr, true}, % 设置是否做待发送队列一次性推送, 同上, 游戏服务之类不需要 {delay_send, false}, % 缓冲待处理队列长度, 也就是数据连接之后消息队列长度 {backlog, 5120}, % Socket 被关闭之后数据是否还能将缓冲区数据推送, 游戏服务最好关闭连接之后一起推送 {exit_on_close, true}, % 系统发送数据的超时时间, 超过指定时间会返回 {error, timeout} {send_timeout, 12800} ], ok.
    Erlang Created Tue, 16 Jul 2024 22:36:23 +0800
  • Erlang进阶(三) 这个篇章会稍微加速说明比较多知识点, 涵盖了 字符串/二进制/Erlang进程 方面. string|字符串 Erlang 实际上来说是没有字符串类型, 所谓的字符串实际上是 List 类型的对象: %%% 测试入口方法 strings_main() -> Str1 = "ThisIsString", if erlang:is_list(Str1) -> io:format("String is List~n") end, % 这里看起来很美好的获取长度 io:format("StringText: ~ts,StringLen: ~w~n", [Str1, length(Str1)]), %% 但是涉及到非英语的情况会自动切换成utf8识别获取长度, 同时非纯英文需要采用 ~ts 进行格式化输出 Str2 = "中文内容", % 注意按照中文来说这里只有4个字符 io:format("ChineseText: ~ts,StringLen: ~w~n", [Str2, length(Str2)]), %% Erlang内部工具库集成字符串处理, 下面是有bug内容代码 Str3 = string:replace(Str2, "内容", ""), % 注意这里替换两个中文字符, 实际上长度是2 io:format("ChineseText: ~ts,StringLen: ~w~n", [Str3, length(Str3)]), % 很遗憾, 这里输出的是 = ChineseText: 中文,StringLen: 3 ok.
    Erlang Created Mon, 15 Jul 2024 22:23:46 +0800
  • Erlang进阶(二) 之前已经构筑好自己的游戏项目初期工程, 现在继续深入 Erlang 的进阶概念, 这次学习的新概念: include: 头文件 spec: 强类型声明 record: 数据记录 这三个也算是 Erlang 所要了解的概念, 有利于构建出合理规范的项目结构. include/头文件 如果之前学习过 C/C++ 语言就会知道很多会定义大量的 file.h/file.hpp 头文件, 而 Erlang 作为可以和 C/C++ 交互的语言也衔接上这些概念. 一般来说, Erlang 的头文件都是放置在项目根目录的 include 之中, 并且文件后缀以 .hrl 结尾. 这里假设定义全局配置头文件来编写些通用静态配置: vim include/common.hrl 通用配置文件如下: %%%------------------------------------------------------------------- %%% @author MeteorCat %%% @copyright (C) 2024, <COMPANY> %%% @doc %%% 通用配置头文件 %%% @end %%% Created : 14. 7月 2024 下午 10:51 %%%------------------------------------------------------------------- -author("MeteorCat"). %%% 定义保护宏, 防止多次引入的重复定义 -ifndef(__ERLANG_COMMON__). -define(__ERLANG_COMMON__, 1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 项目相关的常量 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -define(PROJECT_NAME, "fight-game").
    Erlang Created Sun, 14 Jul 2024 22:32:16 +0800
  • Erlang进阶(一) 之前演示过简单得学习基本类型/函数声明等, 后续需要构建项目建议先了解 Emakefile: 打包部署 这里建议默认项目目录构建: /(根目录) ------- _build(编译打包出来数据) | | | |------- release(正式包, 移除调试信息) | | | |------- dev(开发包, 本地测试环境) | | |--- config(配置文件目录) | | |--- include(头文件目录) | | |--- src(源代码目录) | | | | | | | |------- utils(工具目录, 所有常用工具采用 `类型_utils.erl` 编写) | | | | | |------- 项目名.app.src( 工程信息文件 ) | | | | | |------- 项目名.erl( 工程入口文件 ) | | | |--- Emakefile(主打包文件) | | |--- Emakefile.
    Erlang Created Sun, 14 Jul 2024 17:17:36 +0800
  • Erlang开发|打包|部署 对于 Erlang 开发环境早期都是采用以下进行编译部署: 裸写启动程序 早期直接 shell 脚本启动就行, 简单暴力没什么需要说的, 只能适合简单初级的项目 # 直接命令行唤起 erlang 调用文件 # 设置模块搜索目录(-pa), 设置启动和退出回调(-s 初始化回调 退出回调 ), 同时不需要直接启动 shell erl -pa /data/game/prod -pa /data/game -eval app:main(). -s init stop -noshell EMakefile编译 这是 erlang 内置的类似于 Makefile 编译部件, 执行命令: # 搜索项目目录下的 Emakefile 文件并且执行编译打包 erl -make 项目打包资源 Emakefile 文件内容如下: { ["src/*"], [{outdir, "./_build/dev/beam"}, {i, "include"}] }. { ["src/utils/*"], [{outdir, "./_build/dev/beam"}, {i, "include"}] }. { ["src/lib/*"], [{outdir, "./_build/dev/beam"}, {i, "include"}] }. { ["src/mod/*"], [{outdir, ".
    Erlang Created Sun, 14 Jul 2024 11:12:59 +0800
  • Erlang 入门 最近项目可能需要转 Erlang 做游戏服务端, 所以需要开始快速入门转开发, 这里补充些基础语法: %%%------------------------------------------------------------------- %%% @author MeteorCat %%% @copyright (C) 2024, <COMPANY> %%% @doc %%% %%% @end %%% Created : 09. 7月 2024 下午 04:34 %%%------------------------------------------------------------------- -module(app). -author("MeteorCat"). %% API -import(lists, [nth/2]). -export([start/0]). % 启动入口 start() -> io:format("Service Started ~n"), % 类型学习 learn_types(), % 变量学习 learn_variables(), % 概念构成 learn_syntax(), % 运算学习 learn_operators(), % 循环学习 learn_each(), % 分支学习 learn_decision(), % 匿名函数和匹配模式 learn_fun_and_maths(), %% 这些都是基础, 还有包括函数导出和声明基本基础不需要赘述 %% 消化完这些知识点就是准备并发和进程构建等进阶 ok.
    Erlang Created Wed, 10 Jul 2024 21:47:55 +0800