【从零开始学Skynet】基础篇(八):简易留言板

news2025/1/18 6:57:32

        这一篇我们要把网络编程和数据库操作结合起来,实现一个简单的留言板功能。

1、功能需求

        如下图 所示,客户端发送 “set XXX” 命令时,程序会把留 言“XXX” 存入数据库,发送 “get” 命令时,程序会把整个留言板返回给客户端。

 

2、代码实现

(1)在skynet/examples目录下新建一个main_message.lua文件,代码如下:

local skynet = require "skynet"
local socket = require "skynet.socket"
local mysql = require "skynet.db.mysql"

local db = nil

function connect(fd, addr)
    --启用连接
    print(fd.." connected addr:"..addr)
    socket.start(fd)
    --消息处理
    while true do
        local readdata = socket.read(fd)
		--正常接收
		if readdata ~= nil then
			--返回留言板内容
			if readdata == "get\r\n" then
				local res = db:query("select * from message")
				for i,v in pairs(res) do
					socket.write (fd, v.id.." "..v.content.."\r\n")
				end
			--留言
			else
				local data = string.match(readdata, "set (.-)\r\n")
				db:query("insert into message (content) values (\'"..data.."\')")
			end
        --断开连接
        else
            print(fd.." close ")
            socket.close(fd)
        end
	end
end

skynet.start(function()
    --网络监听
    local listenfd = socket.listen("0.0.0.0", 6666)
    socket.start(listenfd ,connect)
    --连接数据库
     db = mysql.connect({
        host="127.0.0.1",
        port=3306,
        database="skynet",
        user="root",
        password="root",
        max_packet_size = 1024 * 1024,
        on_connect = nil
    })
end)
  • 新增变量 db 用于保存数据库对象;
  • 服务启动后,开启网络监 听,并发起数据库连接;
  • 如果客户端发送的数据是 “get\r\n” ,则查询数据库,然后将结果一条条地发回;
  • 如果客户端发送的是 “set XXX” ,则用正则表达式将字符串XXX 提取出来(变量 data ), 然后插入数据库中。
    说明: “\r\n” 即换行符,在 telnet 中输入字符串,它会把换行符也发给服务端。

(2)在skynet/examples目录下新建一个config_message配置文件:

root = "./"
thread = 8
logger = nil
harbor = 0
start = "main_message"	-- main script
bootstrap = "snlua bootstrap"	-- The service for bootstrap
luaservice = root.."service/?.lua;"..root.."test/?.lua;"..root.."examples/?.lua"
lualoader = "lualib/loader.lua"
snax = root.."examples/?.lua;"..root.."test/?.lua"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"

 3、代码运行

打开终端输入指令:

  • cd skynet
  • ./skynet examples/config_message

         如果运行报错,可能是监听端口被占用,可能是多次运行服务端所致,可以执行“ killall skynet ”命令关闭所有的Skynet 进程,然后在运行。如下图所示:

 

 打开一个telnet客户端去连接主服务,然后输入get,显示结果如下图所示:

 

 然后再输入set world,再输入get,显示结果如下图所示:

 

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

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

相关文章

怎么把视频转成mp3音频,下面有四个方法

你有没有遇到过这种情况,看了一部电影或者纪录片,里面的背景音乐或者对白让你很感动,但是我们只需要其中的音频部分,比如在手机上收听音乐或者创作自己的音频内容。这时候我们可以先把视频保存下来,然后通过视频转音频…

光耦继电器工作原理及优点概述

光耦继电器是一种电子元器件,也是固态继电器的一种,其主要作用是隔离输入与输出电路,用于保护或者控制电路的正常工作。 光耦继电器工作原理是利用光电转换器将外界信号转化为光信号,通过光纤传输到另一端,再由另一端的…

【C生万物】 数组篇

欢迎来到 Claffic 的博客 💞💞💞 前言: 这个专栏好久没更新了,今日诗兴大发,打算尽快完成这个专栏,这期讲数组。 目录 Part1:一维数组 1.创建 2.初始化 3.使用 4.在内存中的存储 Part2:二…

安卓开发学习记录(续)

文章目录十一、综合训练(购物车功能)十二、内容提供者Provider十一、综合训练(购物车功能) 实现功能: 手机商品页面展示,加入购物车功能,商品详情页面,清空购物车,删除购…

C++算法初级9——递归

C算法初级9——递归 文章目录C算法初级9——递归递归求阶乘递归求斐波那契数列递归,简单地来说,就是一个函数自己调用自己。函数f()就好像是工厂中生产零件的模板,每次我们调用函数f()的时候,都会依照模板生产一个新的零件&#x…

项目4:后台管理的开发和使用(前端)

项目4:后台管理的开发和使用(前端) 1.npm包管理器的基本学习 2.利用现成后台管理系统开发 3.后台管理系统的路由配置 4.后台管理系统的地址访问配置 5.前后端联调 6.完善积分等级的前端系统 7.对前端系统的全面分析(Vue组件…

跳槽进阿里了,其实也没那么难...

对于很多没有学历优势的人来说,面试大厂是非常困难的,这对我而言,也是一样,出身于二本,原本以为就三点一线的生活度过一生,直到生活上的变故,才让我有了新的想法和目标,因此我这个二…

【C++ -模块一 常量变量、关键字、数据类型】

C 模块一C框架代码:第一个C程序,打印hello C !代码注释:一 变量和常量:1.1变量变量创建语法:1.2 常量:不能被修改的数据(1) #define定义的宏常量:一般写在文件…

排序(3)之交换排序

目录 前言 交换排序 1.冒泡排序 1.1冒泡排序的实现 1.2 特性总结 2.快速排序 2.1hoare版本 2.2 挖坑法 2.3 前后指针版本 3.快速排序的优化 3.1 三数取中法 3.2 小区间优化 4.快速排序的非递归实现 前言 今天小编给大家带来交换排序的内容,对于交换排序…

C-关键字(下)

文章目录循环控制switch-case-break-defaultdo-while-forgetchar()break-continuegotovoidvoid*returnconstconst修饰变量const修饰数组const修饰指针指针补充const 修饰返回值volatilestruct柔型数组union联合体联合体空间开辟问题利用联合体的性质,判断机器是大端还是小端enu…

力扣javascript刷题343——动态规划之整数拆分

这几天有在开始投暑期实习的简历,可能确实是投的太晚了,好多厂都没有hc了,阿里简历面都没过(感觉是kpi面试),被深深打击到了呜呜呜,花了两天整理情绪,重新出发,下篇文章针…

mysql 索引详解

mysql 索引索引分类1. 普通索引和唯一索引2. 单列索引和组合索引3. 全文索引4.空间索引操作使用索引1. 在已有表中添加索引2. 删除索引索引是一个单独存储在磁盘上的数据库结构,使用索引可以快速找出在某个或多个列中有一特定值的行,提高查询…

【C语言 -结构体 结构体声明、定义、初始化、结构体成员访问、结构体传参】

C语言 - 结构体声明、定义、初始化、结构体成员访问、结构体传参一 结构体类型的声明:声明格式:二 结构体的定义并初始化2.1用结构体创建(定义)结构体变量(对象)的两种方式:(1&#…

WebRTC 系列(三、点对点通话,H5、Android、iOS)

WebRTC 系列(二、本地 demo,H5、Android、iOS) 上一篇博客中,我已经展示了各端的本地 demo,大家应该知道 WebRTC 怎么用了。在本地 demo 中是用了一个 RemotePeerConnection 来模拟远端,可能理解起来还有点…

HTTP协议:当下最主流的应用层协议之一,你确定不了解一下吗?

一.HTTP协议的含义http是什么?超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。‘超’可以理解为除了文本之外的图片,音频和视频,和一些其他…

硬盘、文件系统相关常识

1.硬盘 以机械硬盘为例,下面是机械硬盘的外形结构。 结构图: 每个磁盘分为两个盘面,每个盘面中有很多磁道(Disk Track),每个磁道上有很多扇区(Sector),磁道上的一段一段的就是扇区。 扇区是最小的单位,…

Flutter开发日常练习-黑白主题

1.添加了白天黑夜模式 2.country_picker: ^2.0.20 城市信息框架 3.image_picker: ^0.8.53 photo_manager: ^2.3.0 相机和相册的调用 4.shared_preferences: ^2.0.8 sqflite: ^1.3.1 path: 数据异步持久化到磁盘 注:登录的时候记录一下登录状态isLogin,通过isLogin来标记是否…

OCR之论文笔记TrOCR

文章目录TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models一. 简介二. TrOCR2.1. Encoder2.2 Decoder2.3 Model Initialiaztion2.4 Task Pipeline2.5 Pre-training2.6 Fine-tuning2.7 Data Augmentation三. 实验3.1 Data3.2 Settings3.2 Resul…

如何战胜AI?唯努力尔-- DSP算法的FPGA实现指南

如何战胜AI?唯努力尔! DSP算法的FPGA实现指南! 来一集番外。 而这 也是开坑的第一个算法!我们先讲案例再谈实现指南 文章目录如何战胜AI?唯努力尔! DSP算法的FPGA实现指南!观前提醒实用算法原理数学原理代码模块划分与实现FIR滤波器误差计算与系数更新模块最终代…

算法 贪心2 || 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

122.买卖股票的最佳时机II 如果想到其实最终利润是可以分解的,那么本题就很容易了! 如何分解呢? 假如第0天买入,第3天卖出,那么利润为:prices[3] - prices[0]。 相当于(prices[3] - prices[2]) (prices[2…