文档章节

Skynet 小试Debug_console...

水果糖
 水果糖
发布于 2017/02/25 15:43
字数 812
阅读 207
收藏 0

    昨天凌晨4点还在写Skynet 服务试玩,结果发现自己写的服务出现内存泄漏了。

    今天早上起床吃早餐的时候一直在想:

    "如果每个Lua服务处理完客户端关闭的网络连接后,服务是否会自动退出呢?"

    答案:不会!

 

    现在,我们来看昨天写的Lua网络连接处理服务:

    首先是main.lua:

local skynet = require "skynet"
local socket = require "socket"



skynet.start(function()

	local id = socket.listen("192.168.2.5",80)
	
	socket.start(id , function(fd,addr)
	
		local cnn = skynet.newservice "network"
		skynet.send(cnn,"lua","SOCKET",fd)
		socket.abandon(fd)

	end)
	--skynet.exit()
end)

 

    这里没什么问题,毕竟如果你skynet在start函数内退出,你监听的套接字也将被清空。

    然后是network.lua:

local skynet = require "skynet"
local socket = require "socket"

skynet.init(function()
	print("init was success...")
end)

local CMD = { }


function CMD.SOCKET(fd)

	socket.start(fd)
	socket.write(fd,"welcome!\n\r>>")

	while fd do

		local buf = socket.readline(fd)

		if buf and buf ~= "exit()" then

			socket.write(fd,"you say: " .. buf .. "\r\n>>")

		else
			skynet.error("Client Closed this Connection...")
			socket.close(fd)
			break
		end
	end

end

skynet.start(function()
	skynet.dispatch("lua",function(_,_,cmd,fd)

		local f = assert(CMD[cmd])
		if f then
			f(fd)
		end
	end)
end)

 

    首先while语句开始,读取client 内容然后进入判断。

    然后socket阻塞连接并等待客户端数据。

    最后客户端关闭连接进入socket.close阶段,并且退出While循环。

    粗略一下没什么问题!但是细心的朋友可以看出,前面main文件在start方法内没调用skynet.exit就会一直存在。那我们怎么知道一个服务知否存在呢? 这就要靠debug_console了,我们简单修改一下main.lua文件,启动debug_console服务。

    修改后的main.lua文件如下:

local skynet = require "skynet"
local socket = require "socket"


skynet.start(function()
	skynet.newservice("debug_console",8000) -- 开启debug_console服务
	local id = socket.listen("192.168.2.5",80)
	socket.start(id,function(fd,ipaddr)
			print(fd,ipaddr)
			local cnn = skynet.newservice "network"
			print(cnn)			
			skynet.send(cnn,"lua","SOCKET",fd)
			socket.abandon(fd)
	end)

end)

    我在开始时,先启动debug_console服务并监听8000端口;然后我们使用telnet连接上去。

    

    这个"7 connected" 表示我们的console已经连接上了。

    

    然而我们的客户端还未进行连接,所以我们先list一下后发现network服务是没有启动;

    

    这时候,可以在cmd命令行内输入 telnet 192.168.2.5 80来发起一个客户端连接。

    

    好的,服务端已经进行了正确的回应。这时候我们在console 内再次进行list;

    

    network的lua服务已经启动并且接手管理socket连接相关处理,而我们的服务内只是简单完成了请求、回应相同数据的逻辑。

    这时候我们将client断开后再list会发现:network服务没有按照我预先想的那样自己退出。debug单步调试后也发现连接被close掉了。而此外你gc也仅仅只是进行lua代码的垃圾回收,而无法退出一个服务、

    

    至此,我们只能使用kill命令强行杀掉这个服务了。

    

    我们的lua服务必须在每个连接close后主动调用skynet.exit,否则一个隐式的内存泄漏将会产生。

    如果我们在一个万人在线的游戏服务器不小心犯了这个错误,每个用户只要重复登录5次,服务器的内存将会瞬间被吃光。

© 著作权归作者所有

共有 人打赏支持
水果糖
粉丝 15
博文 157
码字总数 52251
作品 0
深圳
程序员
开源并发框架 Skynet 发布第一个正式版 v0.1.0

距离 skynet 开源项目的公布 已经有 20 月+ 了,如果从闭源阶段算起,已经超过了 30 个月。在我们公司内部有五个项目使用 skynet 开发,据有限的了解,在我们公司之外,至少有两个正式项目使...

C_Z
2014/04/23
3.9K
6
skynet 入门笔记(1):Hello, skynet!

Hello, Skynet! Skynet这名字让我想起了经典科幻电影《终结者》里毁灭人类世界的终极人工智障,skynet的官方文档是挺给力的,但是没有那么好的引导机制,看了半天的文档还是不知道该怎么用s...

uniqptr
06/27
0
0
Skynet 1.0.0 正式发布,开源并发框架

Skynet 1.0.0 正式发布了。经历了 5 个 RC 版后,skynet 终于迎来了第一个正式发布版 1.0.0 。 Skynet 是一个基于 Actor 模式的开源并发框架。 skynet 节点,通过 master ,认识网络中所有其...

oschina
2016/07/12
3K
4
游戏服务器架构调研报告

服务器架构调研报告 刘源霖20151119 1. 前言 本文档主要是调研分析新的手游服务端架构,为下一款手游服务端研发提供可参考的方案。主要的参考点是数据持久化,并发效率,分布式,沙盒机制,热...

shezjl
2016/01/22
2K
1
Skynet 1.0.0 RC 版发布,开源并发框架

拖了很久,终于决定给 skynet 1.0.0 封版了。比预期的时间 足足晚了半年,好在还是在 2015 年把这个事情启动了。 其实已经很久没有对已有特性做修改了,如果的项目是在今年 3 月份以后跟进的...

oschina
2015/12/29
2.3K
7

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
5
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
4
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部