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

2024-04-24 19:44

本文主要是介绍【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] = nilskynet.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 thenreturn ""elseif n == 1 thenreturn tostring(...)elsereturn table.concat({...}," ")endend,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})
endskynet.init(init)skynet.start(function()local port = 8000local 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)
endskynet.init(init)skynet.start(function()
end)

配置文件

-- config.echo
-- 启动多少个工作线程
thread = 8-- skynet 工作在单节点模式下
harbor = 0-- skynet 节点的主程序
start = "agent_mgr"-- lua 服务所在的位置
luaservice = "./service/?.lua"
cservice = "./cservice/?.so"

这篇关于【skynet】 网络编程之回显服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932673

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Windows Server 2025 搭建NPS-Radius服务器的步骤

《WindowsServer2025搭建NPS-Radius服务器的步骤》本文主要介绍了通过微软的NPS角色实现一个Radius服务器,身份验证和证书使用微软ADCS、ADDS,具有一定的参考价... 目录简介示意图什么是 802.1X?核心作用802.1X的组成角色工作流程简述802.1X常见应用802.

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o