当前位置: 首页 > news >正文

【从零开始学Skynet】基础篇(五):简易聊天室

        在游戏中各玩家之间都可以进行聊天之类的交互,在这一篇中,我们就来实现一个简易的聊天室功能,这在上一篇代码的基础上很容易就能实现。

1、功能需求

 客户端发送一条消息,经由服务端转发,所有在线客户端都能收到,如下图所示:

2、代码实现

        在skynet/examples目录下创建main_chat.lua文件,然后把main_echo.lua的代码复制过来,稍作修改,代码修改后如下图所示:

local skynet = require "skynet"
local socket = require "skynet.socket"local clients = {}
function connect(fd, addr)--启用连接print(fd.." connected addr:"..addr)socket.start(fd)clients[fd]={}--消息处理while true dolocal readdata=socket.read(fd)--正常接收if readdata~=nil thenprint(fd.." recv "..readdata)for i, _ in pairs(clients) do --广播socket.write(i, readdata)end--断开连接elseprint(fd.." close ")socket.close(fd)clients[fd]=nilendend
endskynet.start(function()local listenfd = socket.listen("0.0.0.0", 8888)socket.start(listenfd ,connect)
end)
  1. 首先定义一个表clients,用于存放客户端连接,它将以连接标识fd为索引来保存连接信息;
  2. 客户端建立连接时connect被调用,它会通过“clients[fd]={}”把新的fd存放到clients表中;
  3. 若在此过程中接收到数据,则遍历clients表,逐个转发;
  4. 断开连接时,通过clients[fd]=nil删除客户端信息。

3、配置文件

skynet/examples目录下创建config_chat文件,配置参数如下所示: 
include "config.path"thread = 8
logger = nil
logpath = "."
harbor = 0
start = "main_chat"	-- main script
bootstrap = "snlua bootstrap"	-- The service for bootstrap
-- snax_interface_g = "snax_g"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"

4、运行代码

  1. 首先在终端输入指令(这里不再重复,上一篇文章有),启动主服务;
  2. 然后开启两个telnet客户端对主服务进行连接;
  3. 连接成功之后,客户端1号发送“hello”的消息给主服务;
  4. 主服务收到消息之后,再转发给客户端1号客户端2号

http://www.lryc.cn/news/58901.html

相关文章:

  • HDU - 2089 不要62(数位DP)
  • 网络安全与防御
  • 【DT】蒸脱机的结构和工作原理
  • Docker管理软件
  • 关于运行时内存数据区的一些扩展概念
  • 计算机组成原理第二章数据的表示与运算(中)
  • 我的第一台电脑的故事
  • 【1041. 困于环中的机器人】
  • 几何算法——4.交线(intersection curve)的表达与参数化、微分性质
  • 【GPT】让你事半功倍特别好用的5个GPT工具
  • 人工智能大模型多场景应用原理解析
  • SpringBoot默认包扫描机制与默认配置文件
  • RabbitMq 消息可靠性问题(一) --- publisher发送时丢失
  • Java初识泛型
  • 寸照换底色技巧大全,超详细图文教程
  • 这篇文章价值很大:股票历史分时成交数据怎么简单获取?【干货】
  • muduo源码剖析--Buffer
  • AI人工智能简介和其定义
  • python数据清洗
  • Python3 os.makedirs() 方法、Python3 os.read() 方法
  • 【Linux安装数据库】Ubuntu安装mysql并连接navicat
  • GaussDB工作级开发者认证—第一章GaussDB数据库介绍
  • 阿里张勇:所有行业都值得用大模型重新做一遍!
  • ES6(字符串的扩展与新增方法)
  • rk3568点亮LCD(lvds)
  • 全终端办公电子邮件集成方案
  • 再不转型为ChatGPT程序员,有遭受降维打击的危险
  • maven使用教程
  • Emlog底部显示当前在线人数
  • 【java踩坑搞起】MybatisPlus封装的mapper不支持 join,那咋办