【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

相关文章

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统

nginx配置多域名共用服务器80端口

《nginx配置多域名共用服务器80端口》本文主要介绍了配置Nginx.conf文件,使得同一台服务器上的服务程序能够根据域名分发到相应的端口进行处理,从而实现用户通过abc.com或xyz.com直... 多个域名,比如两个域名,这两个域名其实共用一台服务器(意味着域名解析到同一个IP),一个域名为abc

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu