文档章节

Skynet 小试Debug_console...

水果糖
 水果糖
发布于 2017/02/25 15:43
字数 812
阅读 275
收藏 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次,服务器的内存将会瞬间被吃光。

© 著作权归作者所有

共有 人打赏支持
水果糖
粉丝 17
博文 158
码字总数 52482
作品 0
深圳
程序员
私信 提问
skynet 入门笔记(1):Hello, skynet!

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

uniqptr
2018/06/27
0
0
开源并发框架 Skynet 发布第一个正式版 v0.1.0

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

C_Z
2014/04/23
3.9K
6
游戏服务器架构调研报告

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

shezjl
2016/01/22
2K
1
Ubuntu 10 .04 在Vmware 7.0下键盘不能用

今天小试了 安装 Ubuntu 10.04,安装在vmware 7上,结果键盘不能用,经过google得到了下面的解决方法。 Ubuntu 10.04安装在Vmware 7.01中;进入图形登陆界面中,键盘失效,不能使用。 解决方...

睡的比鸡晚
2010/08/12
0
0
Skynet 1.0.0 正式发布,开源并发框架

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

oschina
2016/07/12
3.1K
4

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
44分钟前
0
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
4
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部