文档章节

Skynet 小试Debug_console...

水果糖
 水果糖
发布于 2017/02/25 15:43
字数 812
阅读 233
收藏 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
博文 158
码字总数 52482
作品 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
Ubuntu 10 .04 在Vmware 7.0下键盘不能用

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

睡的比鸡晚
2010/08/12
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

没有更多内容

加载失败,请刷新页面

加载更多

JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
23分钟前
2
0
C中的宏的使用(宏嵌套/宏展开/可变参数宏)

基本原则: 在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。 #是在定义两边加上双引号 #define _TOSTR(s) #sprintf(_TOSTR(test ABC))pr...

SamXIAO
53分钟前
2
0
SpringBoot 整合异步调用方法

1. 在 SpringBoot 主类上使用 @EnableAsync 注解,开启异步调用功能 package com.codingos.springbootdemo;import org.springframework.boot.SpringApplication;import org.springfra......

北漂的我
今天
1
0
0015-如何使用Sentry管理Hive外部表权限

1.文档编写目的 本文档主要讲述如何使用Sentry对Hive外部表权限管理,并基于以下假设: 1.操作系统版本:RedHat6.5 2.CM版本:CM 5.11.1 3.集群已启用Kerberos和Sentry 4.采用具有sudo权限的...

Hadoop实操
今天
3
0
边缘计算与数据中心的发展趋势

导读 Gartner研究表明,人工智能、物联网和5G助力下一代商业创新,由此产生大量数据,2020年前企业将使用超过75亿台联网设备。 在几乎每个方面,社会的节奏都正变得更快。我们希望客户服务问...

问题终结者
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部