文档章节

Skynet 简单的服务编写 (2)

水果糖
 水果糖
发布于 2017/02/25 03:37
字数 554
阅读 163
收藏 1

            前面我们简单的用Skynet 写了个lua服务,实现了简单的发送消息并调用输出“Hello World!”

    而由于Skynet 是网络框架,所以我们这次用Skynet写一个简单的服务来监听80端口。

 

   具体流程如下:

        1、 在main文件入口内监ip为:192.168.2.5,端口为:80

        2、 使用每个连接进来后新建并初始化一个服务用来处理连接相关操作。

 

#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.exit()呢?

     因为start函数是非阻塞的,所以套接字的回调函数注册到skynet框架后会立刻返回;如果后面调用skynet.exit后将立刻退出main服务,从而清除当前匿名回调函数内的所有内容。

 

#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)

 

        在接收到client端的连接后,main服务将立即新建一个network服务;然后主动调用network通过lua消息将套接字fd传递到network服务内。然后我们可以看到network服务通过接收cmd命令(也就是“SOCKET”),然后进行CMD.SOCKET函数调用传参。

        然后就是我们熟悉的socket的read与write了!通过一个循环我们实现了简单的echo 服务器,并且在Client端离线后我们还需要手动关闭套接字。切记在关闭套接字后还需要跳出while 循环,否则Skynet还会检测到你的服务处于deadloop.....

        最后,如果对API或者各种库的用法有什么不理解的可以到Skynet的Wiki上自行查询;Wik 是中文版且写的十分详细,有兴趣的朋友可以自行研究下。

        

© 著作权归作者所有

共有 人打赏支持
水果糖
粉丝 15
博文 157
码字总数 52251
作品 0
深圳
程序员
游戏服务器架构调研报告

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

shezjl
2016/01/22
2K
1
skynet 入门笔记(2):service 消息收发

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

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

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

C_Z
2014/04/23
3.9K
6
Skynet 设计综述

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

曾劲松
2016/07/28
48
0
当我设计游戏服务器时,我在想些什么?(2)

半年前我参与了一个手游项目,第一次能够主导整个游戏的设计,这篇文章单说服务器的架构,客户端就不提了。 对于服务端,我想从之前的端游服务器改过来肯定是走不通的(详见:),因为手游的...

rangercyh
2015/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
36分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
52分钟前
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
54分钟前
0
0
php-fpm的pool - 慢执行日志 - 进程管理 - open_basedir

php-fpm的pool : 为避免多站点使用同一个pool时因一个站点故障导致php资源耗尽,牵连使用同一个pool的其他站点的正常工作,可对每一个站点设置独立pool。 增加pool: 1.编辑php-fpm配置文件...

ZHENG-JY
今天
0
0
Linux之ssh服务默认端口修改

导读 SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全...

问题终结者
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部