【从零开始学Skynet】基础篇(四):网络模块常用API
1、学习网络模块
| Lua API | 说明 |
| socket.listen(address ,port) | 监听一个端口,返回一个 id ,供 start 使用。 |
| socket.start(id , accept) | accept 是一个函数。每当一个监听的 id 对应的 socket 上有连接接入的时候,都会调用 accept 函数。这个函数会得到接入连接的 id 以及 ip 地址。你可以做后续操作。 |
| socket.read(id, sz) | 从一个 socket 上读 sz 指定的字节数。如果读到了指定长度的字符串,它把这个字符串返回。如果连接断开导致字节数不够,将返回一个 false 加上读到的字符串。如果 sz 为 nil ,则返回尽可能多的字节数,但至少读一个字节(若无新数据,会阻塞)。 |
| socket.write(id, str) | 把一个字符串置入正常的写队列,skynet框架会在 socket 可写时发送它。 |
| socket.close(id) | 关闭一个连接,这个 API 有可能阻塞住执行流。因为如果有其它coroutine 正在阻塞读这个id对应的连接,会先驱使读操作结束,close操作才返回。 |
socket.read中所谓的阻塞模式和 skynet.call一样,都利用了Lua的协程机制。调用socket.read,服务有可 能被挂起,直到接收到数据,才会往下执行。
更多API参见:https://github.com/cloudwu/skynet/wiki/Socket
2、功能开发
学完上面的API,我们来写一个Echo程序,Echo程序其实就是一个开启处理客户端消息的服务,它会把收到的内容原封不动地发回给客户端。以下是Echo程序的示意图:

3、代码实现
(1)主服务
本例只需开启一个服务,在skynet/examples目录下创建main_echo.lua文件,输入代码如下所示:
local skynet = require "skynet"
local socket = require "skynet.socket"function connect(fd, addr)--启用连接print(fd.." connected addr:"..addr)socket.start(fd)--消息处理while true dolocal readdata = socket.read(fd)--正常接收if readdata ~= nil thenprint(fd.." recv "..readdata)socket.write(fd, readdata)--断开连接elseprint(fd.." close ")socket.close(fd)endend
endskynet.start(function()local listenfd = socket.listen("0.0.0.0", 8888)socket.start(listenfd ,connect)
end)
代码说明:
- 先引入skynet和skynet.socket这两个模块;
- 使用skynet.start启动服务后,依次调用socket.listen和socket.start来监听8888端口;
- 新客户端发起连接时,connect方法将被调用;
- 在while循环里,程序先用socket.read接收数据,如果收到数据(if readdata~=nil的真分支),则通过socket.write将数据发回客户端;如果客户端断开了连接 (if readdata~=nil的假分支),则调用socket.close关闭连接;
- “0.0.0.0”表示不限制客户端的IP。
(2)配置文件
在skynet/examples目录下创建config_echo文件,也可以拿之前的配置文件修改"start"的值即可,配置参数如下所示:
include "config.path"thread = 8
logger = nil
logpath = "."
harbor = 0
start = "main_echo" -- main script
bootstrap = "snlua bootstrap" -- The service for bootstrap
-- snax_interface_g = "snax_g"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"
4、运行代码
(1)输入如下指令即可运行:
- cd skynet
- ./skynet examples/config_echo

(2)重新打开终端输入命令,显示如下结果,表示运行成功;

(3)此时我们还需要开启一个telnet来作为我们的客户端去连接主服务,我们再打开一个终端输入指令“telnet 127.0.0.1 8888”;
知识拓展:telnet是Linux下的一个程序,可用于调试TCP连接。如果尚未安装,可执行“apt-get install telnet”安装。输入“telnet [ip] [端口]”即可向指定服务器发起连接,连接成功后还可以在telnet中输入内容,按回车键可将字符串发 给服务端。
5、运行结果
当客户端连接成功后,主服务会收到一条外部访问的IP地址

客户端输入了“hello”发送给服务端,服务器收到消息后再返回给客户端,如下图所示:

相关文章:
【从零开始学Skynet】基础篇(四):网络模块常用API
游戏服务端要处理客户端请求,作为服务端引擎,网络编程也是Skynet的核心功能。1、学习网络模块 skynet.socket模块提供了网络编程的API,常用的API如下表所示:Lua API说明socket.listen(address ,port)监听一个端口,返回…...
怎么免费制作logo?logo免费设计在线生成,从此设计不求人
你有没有因为Logo制作而烦恼过?对于很多人来说,logo制作是一项比较大的工程,需要专门的设计师才能完成。但是请人设计费用高还很费时间,还需多次沟通修改。其实,我们可以自己免费制作logo,下面,…...
【目标检测】目标检测遇上知识图谱:Object detection meets knowledge graphs论文解读与复现
前言 常规的目标检测往往是根据图像的特征来捕捉出目标信息,那么是否有办法加入一些先验信息来提升目标检测的精准度? 一种可行的思路是在目标检测的输出加入目标之间的关联信息,从而对目标进行干涉。 2017年8月,新加波管理大学…...
IDEA重复下载SNAPSHOT包问题
问题现象 reimport 之后 状态栏显示resolving dependencies… 遇到某个比较大的快照包(33M),同一天的第2个版本时 1.0-xxx-SNAPSHOT.时间戳-2 idea importer 会先分片下载 x.jar.part文件中,然后复制为x.jar吧 如图中所示,其实已经下载完了&…...
【Unity入门】12.MonoBehaviour事件函数
【Unity入门】MonoBehaviour事件函数 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)常用的事件函数 (1)start和update方法 之前我们写的脚本,会默认帮助…...
1.3 Docker Compose-详细介绍
Docker Compose是一个用于定义和运行多个Docker容器的工具。它可以让用户轻松地定义和管理多个容器的配置,并且可以通过简单的命令来启动、停止和重启这些容器。在本文中,我们将详细介绍Docker Compose的使用和功能。 一、Docker Compose的安装 Docker…...
数据分析:麦当劳食品营养数据探索并可视化
系列文章目录 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒关注…...
ES6标准
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准 前端es6是模块化开发;es6模块化规范就是浏览器端与服务器端通用的模块化开发规范,其中定义了每一个JavaScript文件都是一个独立的模块,导入其他模块成员…...
ASP一个物流商品运输系统的设计与实现
物流运输行业的今天正朝着追求高效、低成本、稳定可靠的方向发展。本文详细介绍了网上物流管理系统,涉及到客户端运输线路设计、过程跟踪等功能模块以及管理员端的相应模块的具体实现,分析了整个系统的架构、工作原理、实现功能等。系统采用ASPMS SQL以B…...
肖 sir_就业课__009ui自动化讲解
ui自动化讲解 1、你做过自动化测试吗?做过 ui自动化测试、接口自动化、app自动化 2、你讲下你做的ui接口自动化? (1)第一种:按照线性流程讲解 :pythonselenium 库做ui自动化 (2)第二…...
「线性DP」花店橱窗
花店橱窗 https://ac.nowcoder.com/acm/contest/24213/1005 题目描述 小q和他的老婆小z最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里。 但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同…...
数组的去重方法
1、ES6的Set方法去重 new Set是ES6新推出的一种类型。它和数组的区别在于,Set类型中的数据不可以有重复的值。当然,数组的一些方法Set也无法调用。 使用方法:将一个数组转化为Set数据,再转化回来,就完成了去重。 cons…...
ESP32-LORA通信
文章目录好久没更新博客了,今天清明节,写个LORA通信。在此记念在天堂的外婆。祝她安好LORA通信简介一、模块二、使用步骤1.电脑通过USB串口模块联接LORA模块2.ESP32连接LORA通信进行收发通信3.电脑运行调试助手,ESP32运行代码。实现LORA通信测…...
博客首页效果
学习来自风宇blog的博客首页效果 全部用的基本上都是原生的html,css,js特别是flex布局的使用,主轴方向可以是横轴,也可以是纵轴,弹性项还可可以使用百分比sticky粘性布局,作为侧边栏,它不会超出…...
【LeetCode】剑指 Offer(29)
目录 题目:剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 57. 和为s的两个数…...
自然语言处理(八):Lexical Semantics
目录 1. Sentiment Analysis 2. Lexical Database 2.1 What is Lexical Database 2.2 Definitions 2.3 Meaning Through Dictionary 2.4 WordNet 2.5 Synsets 2.6 Hypernymy Chain 3. Word Similarity 3.1 Word Similarity with Paths 3.2 超越路径长度 3.3 Abstra…...
推荐一款 AI 脑图软件,助你神速提高知识体系搭建
觅得一款神器,接近我理想中,搭建知识体系的方法,先来看视频作为数据库开发或管理者,知识体系搭建尤为重要。来看看近些年缺乏足够数据库知识面造成的危害:a/ 数据安全风险:例如,2017年Equifax数…...
掌握这些“学习方法和工具”,让你事半功倍!
在中国这个高竞争的社会环境下,学习成为了每个人都需要掌握的技能。然而,学习并不仅仅是读书和听课,更是需要一系列高效的方法和习惯来提高效率。本文将介绍一些实用的学习经验和方法,以及推荐一些国内好的学习工具和平台…...
MyBatis 源码解析 面试题总结
MyBatis源码学习环境下载 文章目录1、工作原理1.1 初始化1.1.1 系统启动的时候,加载解析全局配置文件和相应的映射文件1.1.2 建造者模式帮助我们解决复杂对象的创建:1.2 处理SQL请求的流程1.2.1 通过sqlSession中提供的API方法来操作数据库1.2.2 获取接口…...
「业务架构」需求工程—需求规范(第3部分)
将用户和系统需求记录到文档中。需求规范它是将用户和系统需求写入文档的过程。需求应该是清晰的、容易理解的、完整的和一致的。在实践中,这是很难实现的,因为涉众以不同的方式解释需求,并且在需求中经常存在固有的冲突和不一致。正如我们之…...
Windows 11 + CUDA 11.7 环境下,TensorRT 8.5.2.2 保姆级安装与配置避坑指南
Windows 11 CUDA 11.7 环境下 TensorRT 8.5.2.2 终极安装指南 刚接触深度学习推理优化的开发者,往往会在环境配置阶段耗费大量时间。TensorRT作为NVIDIA官方推出的高性能推理库,能够显著提升模型在NVIDIA GPU上的运行效率。本文将手把手带你完成Windows…...
阿里千问,有个海外版
阿里千问,有个海外版。我也是最近才知道,用了一下,发现审核尺度明显要宽松很多,国内的千问明显被约束很多,就是个半残品。据说啊,国际版千问的部分数据放在了新加坡,对标的是ChatGPT。好像现在阿…...
CMake + VTK 编译
CMake VTK 编译 1下载 1 CMake下载 https://cmake.org/download/#older2 VTK 下载 https://gitlab.kitware.com/vtk/vtk/-/tags2 安装和解压缩 3 配置CMake 这一部分忘了截图 ,可以查看这里的步骤,基本一致 https://blog.csdn.net/weixin_42964413/arti…...
57:L构建紫队协同:蓝队的协同防御
作者: HOS(安全风信子) 日期: 2026-03-07 主要来源平台: GitHub 摘要: 传统的红队和蓝队分离模式存在沟通障碍,导致防御效率低下。L构建了一套紫队协同系统,通过AI驱动的团队协作、知识共享和防御优化&…...
千问3.5-2B一文详解:4.3GB权重免下载、24GB显存优化、温度参数调优手册
千问3.5-2B一文详解:4.3GB权重免下载、24GB显存优化、温度参数调优手册 1. 千问3.5-2B模型概述 千问3.5-2B是Qwen系列中的小型视觉语言模型,专为图片理解与文本生成任务设计。这个模型最吸引人的特点是它能同时处理视觉和语言信息,让你通过…...
告别复杂配置!Wan2.2-I2V-A14B私有镜像开箱即用,小白也能做视频
告别复杂配置!Wan2.2-I2V-A14B私有镜像开箱即用,小白也能做视频 1. 为什么选择这个私有镜像? 如果你曾经尝试过部署AI视频生成模型,一定经历过这些痛苦:环境配置冲突、依赖版本不匹配、显存不足报错、模型权重下载缓…...
G-Helper完全手册:华硕笔记本终极性能调优指南
G-Helper完全手册:华硕笔记本终极性能调优指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: http…...
ArcGIS Pro像素编辑器实战:5种高效影像处理技巧(附真实案例)
ArcGIS Pro像素编辑器实战:5种高效影像处理技巧(附真实案例) 遥感影像处理是GIS工程师日常工作中的重要环节,而ArcGIS Pro的像素编辑器就像一把精准的手术刀,能帮助我们对影像数据进行精细化处理。不同于传统的批量处理…...
3步解放双手:崩坏星穹铁道自动化工具让资源收集效率提升200%
3步解放双手:崩坏星穹铁道自动化工具让资源收集效率提升200% 【免费下载链接】StarRailAssistant 崩坏:星穹铁道自动化 | 崩坏:星穹铁道自动锄大地 | 崩坏:星穹铁道锄大地 | 自动锄大地 | 基于模拟按键 项目地址: https://gitco…...
VASP机器学习力场训练避坑指南:从INCAR参数设置到声子谱验证的完整流程
VASP机器学习力场训练实战:参数调优与声子谱诊断全解析 在材料计算领域,VASP结合机器学习力场的技术路线正逐渐成为平衡计算精度与效率的黄金标准。但当我们真正着手训练自己的力场模型时,往往会发现教程中的理想案例与实际操作之间存在巨大鸿…...
