文档章节

Skynet 小试Debug_console...

水果糖
 水果糖
发布于 2017/02/25 15:43
字数 812
阅读 162
收藏 0
点赞 0
评论 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
博文 156
码字总数 51701
作品 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
游戏服务器架构调研报告

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

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

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

oschina
2016/07/12
3K
4
Skynet 1.0.0 RC 版发布,开源并发框架

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

oschina
2015/12/29
2.3K
7
Ubuntu 10 .04 在Vmware 7.0下键盘不能用

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

睡的比鸡晚
2010/08/12
0
0
SkyNet:用开源系统管理物联网

在智能手机市场创新乏力的情况下,许多科技厂商将目光转向了物联网领域,一个潜力无限的大市场。最近,Google 32 亿美元收购 Nest,引起了人们的深切关注。这被视为物联网,特别是家庭自动化...

oschina
2014/02/18
7.6K
37
Skynet 设计综述

多线程模式,可以使得状态共享、数据交换更加高效。而多线程模型的诸多弊端,比如复杂的线程锁、线程调度问题等,都可以通过减小底层的规模,精简设计,最终把危害限制在很小的范围内。 做为...

曾劲松
2016/07/28
48
0
console觉醒之路,打印个动画如何?

引言 console作为前端调试中广泛使用的成员之一,忠实担任了明察秋毫的数据检阅师,又默默承受了万千bug的狂风骤雨,它log时云淡风轻,它debug时诚如明镜,它info时温柔细腻,它warn时憋黄了...

youngdro
05/16
0
0
skynet 入门笔记(2):service 消息收发

Skynet 入门笔记(2):Service 消息收发 编写第一个 service 成功了,接下来考虑多个 service 之间如何通信的问题。 skynet 是单进程多线程框架,每个 lua service 独立运行在自己的 lua vm...

uniqptr
06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

TensorFlow 作用域与操作符的受限范围

variable_scope 影响变量和操作符 name_scope 只影响操作符 with tf.name_scope(""),使用空字符串将作用域返回到顶层 tf.variable_scope("") 相当于添加一个空层 import tensorflow as tf...

阿豪boy
9分钟前
0
0
Java面试基础篇——第六篇:常见Map类的区别

常见的map类有: HashMap, ConcurrentHashMap (Jdk1.8) , LinkedHashMap, TreeMap, Hashtable。 其中我们最常用的莫过于HashMap, 和并发情况下使用的ConcurrentHashMap了,它们的主要区别就在...

developlee的潇洒人生
10分钟前
0
0
崛起于Springboot2.X之前端模版freemaker(23)

1、配置文件 spring: freemarker: allow-request-override: false cache: true check-template-location: true charset: UTF-8 content-type: text/html ......

木九天
27分钟前
1
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

夜黑人模糊灬
29分钟前
0
0
大数据分析挖掘技术学习:Python文本分类

引言 文本分类作为自然语言处理任务之一,被广泛应用于解决各种商业领域的问题。文本分类的目的是将 文本/文档 自动地归类为一种或多种预定义的类别。常见的文本分类应用如下: • 理解社交媒...

加米谷大数据
33分钟前
0
0
istio-0.8 指标监控,prometheus,grafana

配置: https://istio.io/docs/tasks/telemetry/metrics-logs/ https://istio.io/docs/tasks/telemetry/tcp-metrics/ envoy拦截请求>上报mixer>对接prometheus>grafana 效果截图: promethe......

xiaomin0322
35分钟前
0
0
公众号推荐

阿里技术 书籍:《不止代码》

courtzjl
38分钟前
0
0
关于改进工作效率

1.给不同的业务线建立需求群,所有的数据需求都在群里面提。 2.对于特别难搞定的事情,到对应的技术哪去做,有问题随时沟通。 3.定期给工作总结形成方法论。 4.学习新的技术,尝试用新的方法...

Avner
45分钟前
0
0
关于thinkphp 框架开启路径重写,无法获取Authorization Header

今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Rewrite......

殘留回憶
49分钟前
0
0
centos 使用yum安装nginx后如何添加模块 10

centos 使用yum安装nginx后如何添加模块 10 centos6.2版本,使用yum来安装了nginx,但是最近需要重新添加模块,所以就傻了,询问下有人知道怎么重新添加模块吗? PS:俺是新手,需要高手救助...

linjin200
52分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部