【skynet】 网络编程之回显服务器

写在前面

skynet 提供了一套 tcp 的 API ,本文将给出简单的回显服务器实现,以及讲解。

文章目录

  • 写在前面
  • 编译 skynet
  • 服务框架
    • agent_mgr
    • agent
  • 注意事项
  • 源代码
    • agent_mgr 服务
    • agent 服务
    • 配置文件


编译 skynet

拉取 skynet 工程

git clone https://github.com/cloudwu/skynet

编译

make linux

服务框架

agent_mgr

  1. 负责启动 gate 服务
    • "L" 表示客服端的消息前带四字节大端序的 msg_size
    • skynet.address(skynet.self()) 把自己设置为 watchdog ,有新连接通过 text 消息告诉自己
    • port TCP 监听端口
    • 0 将 TCP 数据以默认消息类型传输给 agent
    • 256 最多同时连接 256 个 TCP
  2. 新连接时,启动一个新的 agent 并通知 gate
    • newservice 创建一个 新的 agent
    • forward 通知 gate 把 TCP 数据转发给 agent
    • start 通知 gate 开始接收数据
  3. 客户端关闭连接时,回收资源
    • 关闭 tcp 连接,回收文件描述符
    • 通知 agent 把结束服务

agent

  1. 接收来自 gate 的 TCP 数据,并回写
    • socket.write 向 socket 写入数据
    • skynet.ignoreret 忽略消息返回
  2. 接收来自 agent_mgr 的指令,并执行

注意事项

skynet.write 和 skynet.close 中的 id 并非 linux 中的 fd 。

源代码

agent_mgr 服务

-- agent_mgr.lua
local skynet = require "skynet"
local socket = require "skynet.socket"
local queue = require "skynet.queue"
require "skynet.manager"

local cs = queue()
local connections = {}

local CMD = {
    open = function (source, session, _)
        local agent = skynet.newservice("agent")
        connections[session] = { session = session, agent = agent }
        skynet.send(source, "text", "forward", session, skynet.address(agent), skynet.address(source))
        skynet.send(source, "text", "start", session)
    end,
    close = function(_, session, _)
        skynet.error("socket close:", session)
        socket.close_fd(session)
        local connection = connections[session]
        connections[session] = nil
        skynet.send(connection.agent, "lua", "exit")
    end,
}

function init()
    skynet.register_protocol({
        name = "text",
        id = skynet.PTYPE_TEXT,
        pack = function (...)
            local n = select("#" , ...)
            if n == 0 then
                return ""
            elseif n == 1 then
                return tostring(...)
            else
                return table.concat({...}," ")
            end
        end,
        unpack = skynet.tostring,
        dispatch = function (_, source, message)
            local session, cmd, parm = string.match(message, "(%d+) (%w+) ?(.*)")
            local f = assert(CMD[cmd], cmd)
            cs(f, source, tonumber(session), parm)
        end
    })
end

skynet.init(init)

skynet.start(function()
    local port = 8000
    local gate = skynet.launch("gate", "L", skynet.address(skynet.self()), port, 0, 256)
    assert(gate, string.format("launch zinc_gate on port %s fail", port))
end)

agent 服务

-- agent.lua
local skynet = require "skynet"
local socket = require "skynet.socket"
local queue = require "skynet.queue"
require "skynet.manager"

local cs = queue()

function init()
    skynet.register_protocol({
        name = "client",
        id = skynet.PTYPE_CLIENT,
        pack = skynet.tostring,
        unpack = skynet.tostring,
        dispatch = function(session, source, message)
            cs(function()
                socket.write(session, message)
                skynet.ignoreret()
                skynet.error("session:", session, "source:", source, "message:", message)
            end)
        end,
    })
    skynet.dispatch("lua", function(_, _, cmd, ...)
        local args = ...
        cs(function()
            local f = skynet[cmd]
            f(args)
        end)
    end)
end

skynet.init(init)

skynet.start(function()
end)

配置文件

-- config.echo
-- 启动多少个工作线程
thread = 8

-- skynet 工作在单节点模式下
harbor = 0

-- skynet 节点的主程序
start = "agent_mgr"

-- lua 服务所在的位置
luaservice = "./service/?.lua"
cservice = "./cservice/?.so"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/570313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每天一个linux小知识】nslookup

往期文章 tailf 和 tail -f 目录 往期文章什么是 nslookup示例参考 什么是 nslookup nslookup全称 name server lookup nslookup 是一款常用的网络工具,用于查询 DNS 的记录。通过 nslookup,用户可以查找特定主机的 IP 地址、查询域名的 MX 记录&…

Seatunnel-web build:prod 报错 jsx问题

问题1 JSX element implicitly has type any because no interface JSX.IntrinsicElements exists. 问题剖析 在使用typescript的时候,在vue或react、node中报以上错误,是JSX 元素隐式具有类型 "any",因为不存在全局类型 "J…

three.js 3D Banner实战

需求场景 1、加载glb模型 2、设置背景 3、让第一个模型转动&#xff0c;并调整模型的转动速度 4、设置模型的宽度。 遇到的问题 1、为什么加载的模型不能转动&#xff1f; 加载的glb模型需要加入到goup里面才能转动。 代码实施 <script setup> import * as THREE from…

UTC和北京时间

influxdb 的时间为UTC和北京时间相差8小时&#xff0c;需要经常转化&#xff0c;所以有下面的2个常用时间 public static void main(String[] args) {//北京时间当天0点ZonedDateTime dateTime ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));ZonedDateTime beijin…

【zabbix7】新版本尝鲜之connector

zabbix历史版本中&#xff0c;会使用python脚本&#xff0c;把zabbix的告警发送到kafka进行二次处理&#xff0c;或者使用filebeat把zabbix的Export的njson指标数据发送到kafka进行二次处理&#xff0c;然而在zabbix7中新增了新功能connector简化了操作并且可以根据tag进行区分…

微信订阅号绑定Coze(扣子),使用上GPT4

之前试过国外的Coze可以绑定一些通讯工具&#xff0c;从而可以使用相当于chatgpt4的功能&#xff0c;但对于我们来说&#xff0c;使用不太方便。 后来头条又有了国内版的Coze(扣子)&#xff0c;发现可以绑定微信&#xff0c;但那时只有微信服务号可以使用&#xff0c;个人订阅…

【嵌入式】“野指针”和“悬空指针”的奇淫拙劣

【嵌入式】“野指针”和“悬空指针”的奇淫拙劣 1. 前言1.1 授权须知 2. 野指针和悬空指针3.举例说明3.1 示例一&#xff1a;free 之后&#xff0c;没有让指针指向NULL3.1.1 代码解析3.1.2 运行代码的结果3.1.3 程序崩溃在哪&#xff1f; 3.2 悬空指针–释放后使用攻击 1. 前言…

【Linux】LInux下的进程状态

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

自学编程两个月,现在我月入 4 万元

这个外国小哥叫 Nico&#xff0c;他一开始是个编程小白&#xff0c;后来把自己关在房间里花了两个月时间学会了编程&#xff0c;如今正在开发一款名为 Talknotes 的应用&#xff0c;可以将语音备忘录转化为结构化的内容&#xff0c;月收入 5000 美元。 Nico 从高中毕业就开始创…

Linux蓝牙驱动模拟HID设备(把Linux系统模拟成蓝牙鼠标和蓝牙键盘)

by fanxiushu 2024-04-24 转载或引用请注明原始作者。 在经过windows的蓝牙驱动开发模拟成HID设备的大风大浪之后&#xff0c; 现在回到linux下实现相同功能&#xff0c;简直就是如小孩嬉闹一样的轻松。 但无论如何&#xff0c;作为模拟蓝牙HID设备的windows&#xff0c;linux一…

导出瑞芯微(Rockchip)芯片的设备树(Device Tree)

要导出瑞芯微&#xff08;Rockchip&#xff09;芯片的设备树&#xff08;Device Tree&#xff09;&#xff0c;可以使用设备树编译器&#xff08;DTC&#xff0c;Device Tree Compiler&#xff09;。通常&#xff0c;会有一个设备树的源文件&#xff08;.dts&#xff09;&#…

安装Selenium

安装Selenium 【0】引言 ​ 由于sleenium4.1.0需要python3.7以上方可支持&#xff0c;请注意自己的python版本。 【1】使用Pycharm安装 使用 快捷键 Ctrl Alt S 【2】使用 pip 安装 Python3.x安装后就默认就会有pip&#xff08;pip.exe默认在python的Scripts路径下&…

代码随想录算法训练营第四十九天| LeetCode121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

一、LeetCode121. 买卖股票的最佳时机 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html 状态&#xff1a;已解决 1.思路 学了双指针的同学可能会下…

「ETL趋势」FDL数据中心库/表查看和调试功能上线、数据源新增支持MongoDB写入

FineDataLink作为一款市场上的顶尖ETL工具&#xff0c;集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具&#xff0c;进行了新的维护迭代。本文把FDL4.1.6最新功能作了介绍&#xff0c;方便大家对比&#xff1a;&#xff08;产品更新详情&#xff1a;…

float类型的存储

float类型的存储 在计算机科学中&#xff0c;float类型通常指的是单精度浮点数。它是一种用于近似表示实数的方法&#xff0c;特别适用于表示很大或很小的数。float类型在大多数编程语言中遵循IEEE 754标准&#xff0c;这是一个国际标准&#xff0c;用于确保在不同计算机和编程…

了解DNS洪水攻击

域名系统 (DNS) 服务器是互联网的“电话簿“&#xff1b;互联网设备通过这些服务器来查找特定 Web 服务器以便访问互联网内容。在互联网中&#xff0c;DNS 洪水是一种网络攻击方式。 DNS 洪水攻击是一种分布式拒绝服务 (DDoS) 攻击&#xff0c;攻击者用大量流量淹没某个域的 D…

【苍穹外卖】Redis缓存菜品数据-业务逻辑分析

目录 Redis缓存菜品数据-业务逻辑分析1. 需求2. 需要考虑的问题3. 缓存逻辑分析4. 缓存流程图 Redis缓存菜品数据-业务逻辑分析 1. 需求 在菜品展示页面&#xff0c;用户点击每一个分类都会访问一次MySQL数据库数据&#xff0c;当大量用户使用发出大量请求时&#xff0c;会对…

【题目2】 大衍数列,斐波拉契数列等,用VBA 和python解决

目录 0 原始题目&#xff1a;大衍数列 0.1 原始题目 0.2 知识点 1 大衍数列 1.1 大衍数列定义 1.1.1 大衍数列定义 1.1.2 大衍数列注意点 1.2 用VBA实现大衍数列 1.3 用python实现大衍数列 2 斐波拉契数列 /兔子数列/ 黄金分割数列 2.1 斐波拉契数列定义 2.1.1 下面…

AI预测福彩3D第9套算法实战化测试第1弹2024年4月24日第2次测试

今天继续进行新算法的测试&#xff0c;今天是第2次测试。好了&#xff0c;废话不多说了&#xff0c;直接上图上结果。 2024年4月24日福彩3D预测结果 6码定位方案如下&#xff1a; 百位&#xff1a;1、0、2、3、6、7 十位&#xff1a;2、4、1、6、0、5 个位&#xff1a;3、2、4、…

第二证券|股票做短线要关注什么?

在股市中短线交易因其快速的盈利时机而招引了众多投资者&#xff0c;但做短线想要挣钱也不是那么容易的。对于股票做短线要重视什么&#xff0c;第二证券下面就为我们具体介绍一下。 短线交易需重视&#xff1a; 1、商场短期趋势。短线投资者首先需要重视的是全体商场趋势&am…