【从零开始学Skynet】基础篇(四):网络模块常用API

news2025/1/19 3:19:01
        游戏服务端要处理客户端请求,作为服务端引擎,网络编程也是Skynet的核心功能。

1、学习网络模块

  skynet.socket 模块提供了网络编程的 API,常用的API如下表所示:
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 do
        local readdata = socket.read(fd)
        --正常接收
        if readdata ~= nil then
            print(fd.." recv "..readdata)
            socket.write(fd, readdata)
            --断开连接
        else
            print(fd.." close ")
            socket.close(fd)
        end
    end
end

skynet.start(function()
    local listenfd = socket.listen("0.0.0.0", 8888)
    socket.start(listenfd ,connect)
end)

代码说明:

  1. 先引入 skynet skynet.socket 这两个模块;
  2. 使用skynet.start启动服务后,依次调用socket.listen socket.start 来监听 8888 端口;
  3. 新客户端发起连接时, connect 方法将被调用;
  4. while 循环里,程序先用socket.read 接收数据,如果收到数据( if readdata~=nil 的真分
    支),则通过 socket.write 将数据发回客户端;如果客户端断开了连接 (if readdata~=nil 的假分支),则调用 socket.close 关闭连接;
  5. “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

        如果开启服务端时提示“ init service failed: ./lualib/skynet/socket.lua:414: Listen error ”,意味着监听端口 8888被占用,可能是多次运行服务端所致,可以执行“ killall skynet ”命令关闭所有的Skynet 进程。

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

(3)此时我们还需要开启一个telnet来作为我们的客户端去连接主服务,我们再打开一个终端输入指令“telnet 127.0.0.1 8888”

知识拓展: telnet Linux 下的一个程序,可用于调试 TCP 连接。如果尚未安装,可 执行 apt-get  install telnet”安装。输入“telnet [ip] [ 端口 ]” 即可向指定服务器发起连接 ,连接成功后还可以在 telnet 中输入内容,按回车键可将字符串发 给服务端。

5、运行结果

当客户端连接成功后,主服务会收到一条外部访问的IP地址

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你需要知道的企业网页制作流程

企业网页制作是企业建立线上形象和宣传的重要手段之一,它不仅可以提高企业的品牌知名度,还可以扩大企业的影响力和拓展客户群。下面,我们将介绍一些企业网页制作的基本流程和技巧,并结合一个案例来详细解析。 企业网页制作的基本…

【DT】蒸脱机的结构和工作原理

DT蒸脱机的结构和工作原理什么是DTDT结构图工作过程什么是DT DT 蒸脱机(DesolventazationerToaster),根据英文名可以看出来,他的作用是脱溶、烘烤。用于蒸脱湿豆粕中的溶剂。 大豆油生产工艺有2种:压榨油的加工工艺是…

C++标准库--IO库(Primer C++ 第五版 · 阅读笔记)

C标准库--IO库(Primer C 第五版 阅读笔记)第8章 IO库8.1、IO类8.2、文件输入输出8.3、string流总结:第8章 IO库 8.1、IO类 为了支持这些不同种类的IO处理操作,在istream和ostream之外,标准库还定义了其他一些IO类型。 如下图分…

Java中的注解,自定义注解

文章目录1. 注解概述2. 注解与注释3. 注解的重要性4. 常见的Annotation作用4.1 生成文档相关的注解4.2 在编译时进行格式检查(JDK内置的三个基本注解)5. 元注解6. 自定义注解6.1 定义自定义注解6.2 使用自定义注解6.3 读取和处理自定义注解框架 注解 反射 设计模式 1. 注解概…

PC安装虚拟化平台趟坑记录

合肥先进光源永磁多极铁电机控制系统的规划 Zstack EPICS Archiver在小课题组的使用经验 神仙同学的永磁四极铁样铁已经开始加工了,过一个月左右就要回来了,电机控制部分交给留国做,调试的也差不多了。项目买过一台工控机,到时候…

STM32F407ZGT6实现OLED显示屏

1、调试工具 2、OLED简介 3、硬件电路(接线) 本文采用7脚,倘若采用4脚,资料代码啥的可以在江科大B站视频下载: 资料下载:https://pan.baidu.com/s/1SqKyKr5Fsl_9gBJi8aVxTw, 提取码:8kzh&#x…

日本首相会见奥特曼,考虑引入 ChatGPT 技术

文|小戏卖萌屋日本4月12日电,日本国第101任首相,日本自民党总裁岸田文雄4月10日于东京会见了奥特曼先生,二人就 ChatGPT 引入日本的可能性问题交换了意见并进行了深入的讨论。奥特曼先生表示,希望为日本人创造伟大的东…

NumPy 秘籍中文第二版:三、掌握常用函数

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍许多常用函数: sqrt(),log(),arange(),astype()和sum()ceil(),modf()&…

如何突破LinkedIn领英限制,导出非好友邮箱等社交方式

相信做外贸的朋友都有使用过Linkedin,如果还没有使用过的话,我只能说您错过一个很好的平台。只要是厉害的外贸人都特别擅长用Linkedin找客户。 那为什么说Linkedin是外贸业务员开发客户最有效的途径呢?主要基于以下几点: 第一&a…

常见的相似度计算方式

1.欧氏距离(Euclidean Distance) 欧氏距离(也称欧几里得度量)指在mmm维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。 在二维和三维空间中的欧氏距离就是两点之间的实际距离。 计算公式: dist(A,B)∑i1n(Ai−Bi)2dist(A,B)\sqr…

DIN35电压电流转频率单位脉冲输出信号变换器集电极开路隔离变送器

主要特性 将直流电压或电流信号转换成单位脉冲信号。 精度等级:0.1 级、0.2 级。产品出厂前已检验校正,用户可以直接使用。 国际标准信号输入:0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 输出标准信号:0-5KHz/0-…

MySQL 索引常见问题汇总,一次性梳理

hello,大家好,我是张张,「架构精进之路」公号作者。 提到MySQL查询分析,就会涉及到索引相关知识,要想学好MySQL,索引是重要且不得不啃下的一环,今天就把MySQL索引常见问题进行汇总,一…

vue.js实现带表情评论功能前后端实现 (滚动加载效果)

学习链接 vue.js实现带表情评论功能前后端实现(仿B站评论) 实现在vue项目中通过滚动条来滑动加载数据 IntersectionObserver与无限滚动加载 效果图 每次加载2条数据 思路 要实现滚动加载,就是当滚动条滚动到底部的时候,再去请…

零基础如何备考2023年系统集成项目管理工程师中级

系统集成项目管理工程师也是属于软考中级稍微好考一点的,管理类的知识多背多记多刷题。 中级集成是好考的,题目也不难,主要弄清楚47个过程的输入输出,还有工具的使用,几乎很多题都是按照这逻辑来的。 建议可以去网上…

ai写作软件免费-ai写作助手

ai写作 AI写作是一种利用人工智能技术和自然语言处理算法,从大量的数据中挖掘潜在信息、规律及信息流的写作方式。通过AI写作,可快速生成符合规范的文章、报告、文档、邮件等内容,为企业和个人提高效率、减少时间成本、实现更低的文字生产总成…

MySQL查询分组Group By原理分析

目录1. 使用group by的简单例子2. group by 原理分析2.1 explain 分析2.2 group by 的简单执行流程3. where 和 having的区别3.1 group by where 的执行流程3.2 group by having 的执行3.3 同时有where、group by 、having的执行顺序3.4 where having 区别总结4. 使用 group…

PR视频导出文件大

C 选择递刀工具 CtrlK 将视频分隔 pr导出的视频文件太大,通过这2个方法可以大大减小视频的大小,并且画质还能保持清晰! 方法一:修改PR导出视频设置 在导出格式中选择【H.264】,在下面预设的位置选择【匹配源-高比特率…

永久免费内网穿透不限制速度

市面上的免费内网穿透大都有格式各样的限制,什么限制流量啊,每个月要签到打卡啊,还有更改域名地址等,只有神卓互联内网穿透是永久免费没有限制的,白嫖也可以。 这篇文章分享了3个方案,按照性能和综合指标排…

金三银四没把握住,凉了...

大家好,前两天跟朋友感慨,今年的铜三铁四、裁员、疫情导致好多人都没拿到offer!现在互联网大厂终于迎来了应届生集中求职季。 对于想跳槽的软件测试人来说,绝对是个找工作的好时机。这时候,很多高薪技术岗、管理岗的缺口和市场需…

提高stackoverflow方法速度方法

最近有些代码问题需要访问Stack Overflow - Where Developers Learn, Share, & Build Careers 但是刷新太慢,心都碎了 Stack Overflow - Where Developers Learn, Share, & Build CareersStack Overflow is the largest, most trusted online community …