【从零开始学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部分)
将用户和系统需求记录到文档中。需求规范它是将用户和系统需求写入文档的过程。需求应该是清晰的、容易理解的、完整的和一致的。在实践中,这是很难实现的,因为涉众以不同的方式解释需求,并且在需求中经常存在固有的冲突和不一致。正如我们之…...
Simulink模型加密二选一:是选‘受保护模型’还是自己写S-Function?一份给嵌入式代码生成者的选择指南
Simulink模型加密实战:受保护模型与S-Function的深度技术选型 在嵌入式系统开发中,Simulink模型往往承载着核心算法和知识产权。当需要与团队协作或交付给客户时,如何在保证模型可用性的同时防止核心逻辑被窥探或篡改?这成为每个嵌…...
Windows平台APK安装架构革命:从模拟器到原生集成的技术演进
Windows平台APK安装架构革命:从模拟器到原生集成的技术演进 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 当移动生态与桌面系统相遇,技术融合…...
老旧设备AI赋能:开源方案实现群晖NAS人脸识别功能升级
老旧设备AI赋能:开源方案实现群晖NAS人脸识别功能升级 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 在数字化时代,NAS设备已…...
CodeSys自定义HTML5控件:从零构建到工程实践
1. 为什么需要自定义HTML5控件? 在工业自动化领域,可视化监控是设备管理的重要环节。CodeSys作为主流的工业控制开发平台,其WebVisu功能虽然提供了基础控件库,但在实际项目中经常会遇到这样的尴尬:标准控件无法满足特定…...
别再被‘万向死锁’吓到了!一个拧瓶盖的日常例子,5分钟搞懂欧拉角和四元数的区别
从拧瓶盖到游戏开发:用生活常识破解万向死锁之谜 想象一下,你正试图拧开一瓶顽固的矿泉水瓶盖。第一次尝试,你顺时针旋转瓶盖——没动静;于是你调整手腕角度再次尝试,这次瓶盖却意外滑脱了方向。这种日常挫败感&#x…...
Windows Cleaner终极指南:一键解决C盘爆红和系统卡顿的开源神器
Windows Cleaner终极指南:一键解决C盘爆红和系统卡顿的开源神器 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常遇到C盘变红、系统卡顿、开…...
微信小程序登录总失败?从‘一次性code’到‘缓存清理’,这份避坑指南帮你全搞定
微信小程序登录全链路排雷手册:从原理到实战的深度解析 登录功能作为微信小程序用户体系的入口,其稳定性直接影响用户体验和业务转化。但在实际开发中,开发者常会遇到各种"诡异"问题——明明按照文档实现了流程,却频繁出…...
别再让WIFI信号‘水土不服’!Android 13高通平台国家码配置保姆级教程
Android 13高通平台WIFI国家码配置实战指南 当你的设备跨越国界,WIFI信号却开始"水土不服"——连接不稳定、速度骤降甚至完全无法使用。这背后往往不是硬件问题,而是国家码配置这个隐形门槛在作祟。作为深耕Android系统开发多年的技术专家&am…...
实时口罩检测-通用部署教程:Windows WSL2环境下ModelScope模型本地加载
实时口罩检测-通用部署教程:Windows WSL2环境下ModelScope模型本地加载 1. 环境准备与WSL2配置 1.1 WSL2安装与设置 如果你使用的是Windows系统,首先需要安装WSL2(Windows Subsystem for Linux 2)。这是微软提供的Linux兼容层&…...
保姆级避坑指南:用VMware ESXi 8.0给vCenter Server 8.0单独划个“家”(存储+网络配置详解)
VMware ESXi 8.0环境下的vCenter Server 8.0专属部署指南 在虚拟化环境中,vCenter Server作为整个VMware生态系统的"大脑",其部署的稳定性和可靠性直接影响整个虚拟化平台的运行质量。本文将深入探讨如何在ESXi 8.0环境中为vCenter Server 8.0…...
